我正在尝试Python3.5引入的输入提示,使用本地存根作为mypy的输入提示时遇到了问题。
我所做的实验是创建包含
def type_check(a):
pass另外,我把kk.pyi放在
def type_check(a: int):...在同一个目录下。通过这种方式,我试图通过向type_check中的kk.py传递一个字符串来触发“赋值中的不兼容类型”的错误。但是,当我运行mypy kk.py时,没有错误。
因此,我尝试了mypy建议的另一种方法,即将环境变量MYPYPATH设置为~/some/path/stub,并将kk.pyi放在目录中。我没有再犯任何错误。
有人能帮我吗?
下面是多么上使用本地存根的mypy。
发布于 2016-06-14 07:04:48
我不知道为什么有人不回答这个问题就否决了这个问题,也不知道为什么他/她不喜欢这个问题,但我想出的答案是:
mypy的存根文件仅在导入模块时才能工作。因此,如果你有
def try_check(a):
pass在kk.py中,以及
def try_check(a: int):...在kk.pyi中,在kk.py目录或MYPYPATH指定的目录中,如果导入kk,mypy将键入检查python文件。是的,如果你有
import .kk
kk.try_check('str')在test.py并运行mypy test.py中,mypy将报告类型冲突。但是,如果您有,它不会报告冲突。
try_check('str')在kk.py中。
如果在函数定义中显式地写入键入提示,则可以在包含函数定义的程序中键入check函数。例如,您可以编写
def try_check(a: int):
pass
try_check('str')在kk.py和mypy kk.py中。Mypy将报告类型冲突。
发布于 2022-05-20 23:31:07
正如所接受的答案所提到的,不幸地 Mypy在运行mypy X.py时没有对X.py本身使用X.pyi存根文件。
本报告还讨论了这一问题:
https://github.com/python/mypy/issues/5028
我找到的唯一检查模块本身的解决方案是使用mypy.stubtest。
存根文件的一个常见问题是它们往往与实际实现不同。Mypy包括最顽固的工具,它可以在运行时自动检查存根和实现之间的差异。
使用很简单,只需运行python -m mypy.stubtest X (X是没有.py扩展的模块的名称)
示例:
$ python3 -m pip install mypy
$ cat library.py
x = "hello, stubtest"
def foo(x=None):
print(x)
$ cat library.pyi
x: int
def foo(x: int) -> None: ...
$ python3 -m mypy.stubtest library
error: library.foo is inconsistent, runtime argument "x" has a default value but stub argument does not
Stub: at line 3
def (x: builtins.int)
Runtime: at line 3 in file ~/library.py
def (x=None)
error: library.x variable differs from runtime type Literal['hello, stubtest']
Stub: at line 1
builtins.int
Runtime:
hello, stubtesthttps://stackoverflow.com/questions/37537194
复制相似问题