使用 Mypy 本地存根

Posted

技术标签:

【中文标题】使用 Mypy 本地存根【英文标题】:Using Mypy local stubs 【发布时间】:2016-09-28 23:08:17 【问题描述】:

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

我做的实验是创建包含

的kk.py
def type_check(a):
    pass

另外,我把kk.pyi包含了

def type_check(a: int):...

在同一目录中。这样,我尝试通过在kk.py中将字符串传递给type_check来触发“ncompatible types in assignment”的错误。但是,当我运行 mypy kk.py 并没有出现错误时。

因此我尝试了 mypy doc 建议的另一种方法,即将环境变量 MYPYPATH 设置为 ~/some/path/stub 并将 kk.pyi 放入目录中。但是,我遇到了同样的错误。

有人可以帮我解决这个问题吗?

这是how 上的mypy wiki,用于使用本地存根。

【问题讨论】:

在这里找到原因和解决方法:github.com/python/mypy/issues/5520#issuecomment-426371485 【参考方案1】:

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

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

【讨论】:

谢谢!我一直在努力解决这个确切的问题。我真的不明白为什么 mypy 会这样工作。有什么想法吗? @SolomonBothwell 我觉得最初尝试让这个静态检查程序用于像 Django 这样的大模数,所以它假设用户将检查包中的内容而不是自己编写的程序。 您绝对可以对自己的程序进行类型检查,没有必要或没有理由使用单独的存根文件。如果你的程序导入了一个没有注释的第三方库,但你想使用它们,那就需要本地存根。 @OJFord 当然,正如文档所示,我们可以做到。然而,这篇文章的重点是如何使用单独的存根文件来做到这一点,而不是我们想要这样做的原因。 @OJFord 我也更喜欢使用本地存根而不是就地类型提示,因为语法在当前状态下相当臃肿,并且有点使代码读起来不愉快。更不用说循环导入以及在更复杂类型提示的情况下需要申请的变通方法。

以上是关于使用 Mypy 本地存根的主要内容,如果未能解决你的问题,请参考以下文章

如何获取“matplotlib”、“numpy”、“scipy”、“pandas”等的存根文件?

10.Dubbo配置-重试,超时(集群容错),启动检查,多版本,本地存根

使用 mypy 检查类型时有啥问题

对于使用 `type()` 构造的类型,mypy“作为类型无效”

dubbo之本地存根

如何在 mypy 中使用reveal_type