簡體   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