繁体   English   中英

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

[英]Is there a way to automatically verify all imports in a Python script without running it?

假设我有一个有点长的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的运行long_result ,可能会给出NameError: name 'bar' is not defined long_result NameError: name 'bar' is not defined

有一个名为snakefood的模块:

从Python代码生成依赖图

它使用AST来解析Python文件。

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

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

或者,只使用pylint 从文档引用:

错误检测

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

检查模块是否已导入

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM