首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3的类型检查工具

Python 3的类型检查工具
EN

Stack Overflow用户
提问于 2021-01-07 14:18:40
回答 2查看 655关注 0票数 3

我试图运行一个命令,在作为目录提供的Python源代码中提供一些类型检查、静态代码分析等聚合信息。如果存在这种情况,那么我想将其添加到在某些Makefile管道中调用的Makefile中,以验证代码库。

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

文件foo_sample.py

代码语言:javascript
复制
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管道的执行过程中检测它们。

有办法在运行代码之前运行这种检查吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-08 16:51:56

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

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

代码语言:javascript
复制
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中使用这些注释。

票数 2
EN

Stack Overflow用户

发布于 2021-01-08 02:30:06

未声明的类型被认为是Any类型,而不是由mypy检查的类型。需要进行更严格的配置,以确保mypy强制您设置类型。具体来说,您需要disallow_untyped_defs,这应该会导致这样的结果:

代码语言:javascript
复制
$ 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)

您还可能需要disallow_any_genericswarn_return_any示例配置

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65614067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档