假设我有一个有点长的 Python 脚本(太长而无法手动审核),其中包含一个昂贵的操作,然后是一堆依赖于昂贵操作的输出的库函数调用。
如果我没有为库函数调用导入所有必要的模块,那么 Python 只有在昂贵的操作完成后才会出错,因为 Python 会逐行解释。
有没有一种方法可以自动验证我是否拥有所有必要的导入,而无需a) 手动逐行验证它或 b) 每次我错过一个库时都运行昂贵的操作?
提出这个问题的另一种方法是,是否有一个工具可以完成 C 编译器在运行前验证依赖关系方面所做的工作。
假设我有一个有点长的 Python 脚本(太长而无法手动审核),其中包含一个昂贵的操作,然后是一堆依赖于昂贵操作的输出的库函数调用。
如果我没有为库函数调用导入所有必要的模块,那么 Python 只有在昂贵的操作完成后才会出错,因为 Python 会逐行解释。
有没有一种方法可以自动验证我是否拥有所有必要的导入,而无需a) 手动逐行验证它或 b) 每次我错过一个库时都运行昂贵的操作?
提出这个问题的另一种方法是,是否有一个工具可以完成 C 编译器在运行前验证依赖关系方面所做的工作。
不,这是不可能的,因为可以在运行时注入依赖项。
考虑:
def foo(break_things):
if not break_things:
globals()['bar'] = lambda: None
long_result = ...
foo(long_result > 0)
bar()
这取决于 的运行时值long_result
,可能会给出NameError: name 'bar' is not defined
。
有一个名为snakefood的模块:
从 Python 代码生成依赖关系图
它使用 AST 来解析 Python 文件。
这是非常可靠的,它总是运行。没有加载任何模块。加载模块以找出依赖关系几乎总是问题,因为许多代码库在全局命名空间中运行初始化代码,这通常需要额外的设置。Snakefood 保证没有这个问题(它只是运行,无论如何)。
您可以通过调用获取导入列表sfood-imports <script.py>
。然后你可以一个一个地导入列表中的每个模块,看看它是否会抛出ImportError
.
或者,只需使用pylint。引用自文档:
错误检测
检查声明的接口是否真正实现
检查模块是否被导入
希望有帮助。