使用 Mypy 本地存根

问题描述 投票:0回答:2

我正在尝试 Python 3.5 引入的打字提示,但在使用本地存根作为 mypy 的打字提示时遇到了问题。

我做的实验是创建包含

的kk.py
def 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。

python python-typing mypy
2个回答
19
投票

我不知道为什么有人在没有回答或评论为什么他/她不喜欢它的情况下投票否决了这个问题,但这是我想出的答案:

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 会报告类型冲突。


1
投票

正如所提到的接受的答案,不幸的是当您运行

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
© www.soinside.com 2019 - 2024. All rights reserved.