在“编译”期间捕获Python中的导入错误和名称错误

问题描述 投票:4回答:2

你可以使用(linting)工具或编译步骤捕获python中的import / name和其他错误吗?

另一个选择是确保测试所有可能的代码路径(这并不总是可行的,特别是对于大型现有代码库和其他原因)

这里有些例子。

  1. 缺少进口 - 被pylint捕获,虽然作为syntax error而不是import error
def test():
    print("Time now is ..", datetime.datetime())

pylint输出:

E0602: Undefined variable 'datetime' (undefined-variable)
  1. 导入当前,但使用的方法不正确。这传递了pylint和py_compile。
from datetime import datetime
def test():
    print("Time now is ..", datetime.today2())

编辑:添加一个选项。

执行import *会显示一些错误,但不会出现函数内部语句中的错误。

报告此错误

from datetime import datetime
print("today2", datetime.today2())

错误:

Python 3.7.0 (default, Aug 22 2018, 15:22:56)
>>> from test import *
...
    print("today2", datetime.today2())
AttributeError: type object 'datetime.datetime' has no attribute 'today2'
>>>

这不是。

from datetime import datetime
def test():
    print("Time now is ..", datetime.today2())
python-3.x compilation
2个回答
1
投票

根据我的经验,flake8可以很好地捕获缺少的导入和名称错误。为了捕获丢失的导入,您不能使用“from foo import *”之类的通配符导入,因为它无法猜测将创建哪些名称。此外,它存在语法错误时无法执行这些检测,因此您必须先修复它们。


2
投票

与作为编译语言的c ++不同,python是一种解释语言。这意味着它没有编译阶段。它逐行解释代码。

根据这一点,在运行时到达它们之前,您没有找到错误。

如果你想要出现错误,你应该以某种方式抛出你的代码的每一行。最好的方法是使用具有100%测试覆盖率的测试库。

有关更多信息,请查看this question及其答案。

© www.soinside.com 2019 - 2024. All rights reserved.