Python 3.x Python3的类型检查工具

Python 3.x Python3的类型检查工具,python-3.x,pylint,mypy,typechecking,static-code-analysis,Python 3.x,Pylint,Mypy,Typechecking,Static Code Analysis,我正在尝试运行一个命令,在作为目录提供的一些Python源代码中提供一些关于类型检查、静态代码分析等的聚合信息。如果存在这样的东西,那么我想将它添加到一个Makefile,该文件在一些管道中调用,以验证代码库 我创建了这个带有运行时问题的虚拟源代码文件 文件foo_sample.py def foo_func(我的号码): 返回1+my_num def bar_func(): 富富丰(“富”) 如果名称=“\uuuuu main\uuuuuuuu”: bar_func() 它抛出以下运行时错误

我正在尝试运行一个命令,在作为目录提供的一些Python源代码中提供一些关于类型检查、静态代码分析等的聚合信息。如果存在这样的东西,那么我想将它添加到一个
Makefile
,该文件在一些管道中调用,以验证代码库

我创建了这个带有运行时问题的虚拟源代码文件

文件foo_sample.py
def foo_func(我的号码):
返回1+my_num
def bar_func():
富富丰(“富”)
如果名称=“\uuuuu main\uuuuuuuu”:
bar_func()
它抛出以下运行时错误:

TypeError:不支持+:'int'和'str'的操作数类型

现在我尝试用各种工具来检测这种类型的错误,但它们都没有发现此类问题。请参见以下列表中的命令:

  • pyflakes foo_sample.py
  • flake 8 foo_sample.py
  • pylint foo_sample.py
  • mypy——检查未类型化的defs foo_sample.py
  • prospector——严格程度极高的foo_sample.py
我知道我可以通过
unittest
检测到这些问题,但是代码库相当大,在某种程度上没有经过测试。我们经常看到运行时错误,并通过单元测试或集成测试来解决它们。但是,我们希望在执行CI管道期间检测它们

在运行代码之前,有没有办法运行这些检查


如何避免在运行时发现这些错误?

未声明的类型被视为类型
Any
,并且不会由
mypy
进行类型检查。需要更严格的配置,以确保
mypy
强制您设置类型。具体而言,您需要,这将导致您获得以下结果:

$ cat test.py 
def foo_func(my_num: int) -> int:
    return 1 + my_num


def bar_func() -> None:
    foo_func("foo")


if __name__ == "__main__":
    bar_func()
$ mypy test.py
test.py:6: error: Argument 1 to "foo_func" has incompatible type "str"; expected "int"
Found 1 error in 1 file (checked 1 source file)
你可能还想

我发现在这个场景中很有用

在此代码上调用
pytype breaked_code.py
时:

def foo_func(我的号码):
返回1+my_num
def bar_func():
富富丰(“富”)
def运行函数(我的函数):
my_func()
如果名称=“\uuuuu main\uuuuuuuu”:
bar_func()
运行_func(bar_func())
我在输出中正确地发现:

  • 第3行,在foo_func中:+:'int'和'str'不支持的操作数类型[不支持的操作数]
  • 第10行,在run_func中:“NoneType”对象不可调用[不可调用]
命令退出时出错,因此调用它的
Makefile
可能会阻止CI环境中管道的执行

此外,可以使用代码中的注释启用或禁用那些错误检查,如
[不支持的操作数]
,例如

  • 首先禁用检查
    #pytype:disable=属性错误
  • 然后再次启用检查
    #pytype:enable=属性错误

请参阅文档中的如何使用这些注释。

这是一个类型错误,捕捉该错误的最佳工具是
mypy
。不幸的是,如果不声明函数的类型,
mypy
将无法猜测类型。您需要在代码库中添加类型(这可能需要大量的工作,但是,如果您经常出现这样的错误,这可能是一个好主意)。pytype可以与
pip3安装pytype一起安装(在Focal Fossa上试用)。