使用Mypy本地存根

Mus*_*sen 10 python mypy

我正在尝试Python 3.5引入的输入提示,并通过使用本地存根作为mypy的输入提示来解决问题.

我做的实验是创建包含kk.py的

def type_check(a):
    pass
Run Code Online (Sandbox Code Playgroud)

另外,我把kk.pyi包含在内

def type_check(a: int):...
Run Code Online (Sandbox Code Playgroud)

在同一目录中.通过这种方式,我试图通过将字符串传递给kk.py中的type_check来触发"赋值中的ncompatible类型"的错误.但是,当我运行mypy kk.py并且没有错误.

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

有人可以帮我吗?

这是关于如何使用本地存根的mypy wiki .

Mus*_*sen 10

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

mypy的存根文件仅在导入模块时有效.因此,如果你有

def try_check(a):
    pass
Run Code Online (Sandbox Code Playgroud)

在kk.py,和

def try_check(a: int):...
Run Code Online (Sandbox Code Playgroud)

在与kk.py位于同一目录下的kk.pyi中或在MYPYPATH指定的目录中,如果导入kk,mypy将键入检查python文件.如果你有,那就是

import .kk
kk.try_check('str')
Run Code Online (Sandbox Code Playgroud)

在test.py并运行mypy test.py,mypy将报告类型冲突.但是,如果您有冲突,它不会报告冲突

try_check('str')
Run Code Online (Sandbox Code Playgroud)

在kk.py.

您可以在包含函数定义的程序中键入检查函数如果在函数定义中明确写入了类型提示.例如,你可以写

def try_check(a: int):
    pass

try_check('str')
Run Code Online (Sandbox Code Playgroud)

在kk.py然后mypy kk.py.Mypy将报告类型冲突.

  • @OJFord 当然,正如文档所示,我们可以做到。然而,这篇文章的重点是如何使用单独的存根文件来做到这一点,而不是我们为什么要这样做。 (3认同)
  • 谢谢!我正在努力解决这个确切的问题。我真的不明白为什么mypy会这样工作。有任何想法吗? (2认同)
  • @OJFord 我也更喜欢使用本地存根而不是就地类型提示,因为语法在当前状态下相当臃肿,并且有点使代码难以阅读。更不用说循环导入以及在更复杂的类型提示情况下需要应用的解决方法。 (2认同)