Python 3.x Python3的类型检查工具
我正在尝试运行一个命令,在作为目录提供的一些Python源代码中提供一些关于类型检查、静态代码分析等的聚合信息。如果存在这样的东西,那么我想将它添加到一个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() 它抛出以下运行时错误
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上试用)。