3

假设我有一个有点长的 Python 脚本(太长而无法手动审核),其中包含一个昂贵的操作,然后是一堆依赖于昂贵操作的输出的库函数调用。

如果我没有为库函数调用导入所有必要的模块,那么 Python 只有昂贵的操作完成后才会出错,因为 Python 会逐行解释。

有没有一种方法可以自动验证我是否拥有所有必要的导入,而无需a) 手动逐行验证它或 b) 每次我错过一个库时都运行昂贵的操作?

提出这个问题的另一种方法是,是否有一个工具可以完成 C 编译器在运行前验证依赖关系方面所做的工作。

4

2 回答 2

2

不,这是不可能的,因为可以在运行时注入依赖项。

考虑:

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

于 2013-07-23T18:40:16.440 回答
2

有一个名为snakefood的模块:

从 Python 代码生成依赖关系图

它使用 AST 来解析 Python 文件。

这是非常可靠的,它总是运行。没有加载任何模块。加载模块以找出依赖关系几乎总是问题,因为许多代码库在全局命名空间中运行初始化代码,这通常需要额外的设置。Snakefood 保证没有这个问题(它只是运行,无论如何)。

您可以通过调用获取导入列表sfood-imports <script.py>。然后你可以一个一个地导入列表中的每个模块,看看它是否会抛出ImportError.

或者,只需使用pylint。引用自文档:

错误检测

检查声明的接口是否真正实现

检查模块是否被导入

希望有帮助。

于 2013-07-23T18:47:13.393 回答