有没有办法在不运行Python脚本的情况下自动验证所有导入?

时间:2013-07-23 18:37:46

标签: python python-2.7

假设我有一个有点长的Python脚本(手工审计太长),其中包含一个昂贵的操作,接着是一堆依赖于昂贵操作输出的库函数调用。

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

有没有办法自动验证我是否拥有所有必要的导入而不用 a)逐行手动验证它或b)每次错过库时运行昂贵的操作?< / p>

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

2 个答案:

答案 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即可。从文档引用:

  

错误检测

     

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

     

检查模块是否已导入

希望有所帮助。