我试图运行一个命令,在作为目录提供的Python源代码中提供一些类型检查、静态代码分析等聚合信息。如果存在这种情况,那么我想将其添加到在某些Makefile管道中调用的Makefile中,以验证代码库。
我创建了这个带有运行时问题的虚拟源代码文件
文件foo_sample.py
def foo_func(my_num):
return 1 + my_num
def bar_func():
foo_func("foo")
if __name__ == "__main__":
bar_func()它引发这个运行时错误:
TypeError:不支持的操作数类型为+:'int‘和'str’。
现在我尝试用各种工具来检测这种类型的错误,但是他们都找不到这类问题。请参阅以下列表中的命令:
pyflakes foo_sample.py,flake8 foo_sample.py,pylint foo_sample.py,mypy --check-untyped-defs foo_sample.py,prospector --strictness veryhigh foo_sample.py我知道我可以在unittest中检测到这些问题,但是代码库相当大,而且在某种程度上没有经过测试。我们经常看到运行时错误,并使用单元测试或集成测试来解决它们。但是,我们希望在CI管道的执行过程中检测它们。
有办法在运行代码之前运行这种检查吗?
如何避免在运行时发现这些错误?
发布于 2021-01-08 16:51:56
我发现吡咯在这个场景中很有用。
在此代码上调用pytype broken_code.py时:
def foo_func(my_num):
return 1 + my_num
def bar_func():
foo_func("foo")
def run_func(my_func):
my_func()
if __name__ == "__main__":
bar_func()
run_func(bar_func())我在输出中找到了正确的结果:
line 3, in foo_func: unsupported operand type(s) for +: 'int' and 'str' [unsupported-operands]line 10, in run_func: 'NoneType' object is not callable [not-callable]命令退出时会出现一个错误,因此调用它的Makefile可以阻止CI环境中管道的执行。
此外,这些错误检查(如[unsupported-operands]等)可以使用代码中的注释启用或禁用,例如,
# pytype: disable=attribute-error# pytype: enable=attribute-error请参阅如何在文档https://google.github.io/pytype/errors.html中使用这些注释。
发布于 2021-01-08 02:30:06
未声明的类型被认为是Any类型,而不是由mypy检查的类型。需要进行更严格的配置,以确保mypy强制您设置类型。具体来说,您需要disallow_untyped_defs,这应该会导致这样的结果:
$ 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)https://stackoverflow.com/questions/65614067
复制相似问题