假设我有一个有点长的Python脚本(手工审计太长),其中包含一个昂贵的操作,接着是一堆依赖于昂贵操作输出的库函数调用。
如果我没有为库函数调用导入所有必需的模块,那么在昂贵的操作完成之后,Python只会出错,因为Python会逐行解释。
有没有办法自动验证我是否拥有所有必要的导入而不用 a)逐行手动验证它或b)每次错过库时运行昂贵的操作?< / p>
提出这个问题的另一种方法是,是否有一个工具可以执行C编译器在运行时验证依赖关系所做的事情。
答案 0 :(得分: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
。
答案 1 :(得分:2)
有一个名为snakefood的模块:
从Python代码生成依赖图
它使用AST进行解析 Python文件。
这是非常可靠的,它总是运行。 没有模块 已加载。加载模块以确定依赖关系几乎总是如此 问题,因为很多代码库都运行初始化代码 全局命名空间,通常需要额外的设置。 Snakefood是 保证没有这个问题(它只是运行,无论如何)。
您可以致电sfood-imports <script.py>
获取导入列表。然后,您可以逐个导入列表中的每个模块,看看它是否抛出ImportError
。
或者,只需使用pylint即可。从文档引用:
错误检测
检查声明的接口是否真正实现
检查模块是否已导入
希望有所帮助。