我正在尝试 Python 3.5 引入的打字提示,但在使用本地存根作为 mypy 的打字提示时遇到了问题。
我做的实验是创建包含
的kk.pydef type_check(a):
pass
另外,我把 kk.pyi 包含
def type_check(a: int):...
在同一目录中。这样,我尝试通过向type_check
中的
kk.py
传递字符串来触发“赋值中的不兼容类型”的错误。但是,当我运行
mypy kk.py
时,我没有收到任何错误。
因此我尝试了 mypy doc 建议的另一种方法,即将环境变量 MYPYPATH 设置为
~/some/path/stub
并将 kk.pyi
放入目录中。我没有再收到任何错误。
有人可以帮我吗?
这里是关于 how 使用本地存根的 mypy wiki。
我不知道为什么有人在没有回答或评论为什么他/她不喜欢它的情况下投票否决了这个问题,但这是我想出的答案:
mypy 的存根文件仅在导入模块时起作用。因此,如果你有
def try_check(a):
pass
在 kk.py 中,并且
def try_check(a: int):...
在与 kk.py 位于同一目录或 MYPYPATH 指定的目录中的 kk.pyi 中,如果导入 kk,mypy 将键入检查 python 文件。 是的,如果你有
import .kk
kk.try_check('str')
在test.py中运行mypy test.py,mypy会报告类型冲突。但是,如果您有冲突,它不会报告冲突
try_check('str')
在 kk.py 中。
如果您在函数定义中明确编写输入提示,则可以在包含函数定义的程序中输入检查函数。例如,你可以写
def try_check(a: int):
pass
try_check('str')
在 kk.py 中,然后在 mypy kk.py 中。 Mypy 会报告类型冲突。
正如所提到的接受的答案,不幸的是当您运行
X.pyi
时,Mypy不会针对X.py
本身使用mypy X.py
存根文件。
这个问题也在这里得到解决:
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, stubtest