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

时间:2019-04-23 14:01:24

标签: python-3.x compilation

您可以使用(插入)工具或编译步骤在python中捕获导入/名称和其他错误吗?

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

以下是一些示例。

  1. 缺少导入-被pylint捕获,尽管是syntax error而不是import error
def test():
    print("Time now is ..", datetime.datetime())

圆柱输出:

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())

2 个答案:

答案 0 :(得分:2)

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

因此,直到在运行时找到错误,您才发现错误。

如果您希望该错误出现,则应该以某种方式将路径抛出代码的每一行。最好的方法是使用具有100%测试覆盖率的测试库。

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

答案 1 :(得分:1)

以我的经验,flake8在捕获丢失的导入和名称错误方面做得很好。为了捕获丢失的导入,您不能使用通配符导入,例如“ from foo import *”,因为它无法猜测将创建哪些名称。另外,在存在语法错误的情况下,它无法执行这些检测,因此您必须首先修复这些错误。