2013-07-23 43 views
3

假設我有一個比較長的Python腳本(手工審計時間過長),其中包含一個昂貴的操作,後面跟着一堆依賴於昂貴操作輸出的庫函數調用。有沒有辦法自動驗證Python腳本中的所有導入而不運行它?

如果我沒有爲庫函數調用導入所有必需的模塊,那麼在昂貴的操作完成後,Python將只會出錯,因爲Python會逐行解釋。

有沒有一種方法可以自動驗證我是否擁有所有必需的進口而不是或者a)手動逐行驗證它,或者b)每次我錯過一個庫時都要花費昂貴的操作?

另一種解決這個問題的方法是,是否有一種工具可以執行C編譯器在運行時間之前驗證依賴性的功能。

+1

創建一個虛擬版本的昂貴的操作,創建一個虛擬對象,然後運行後面的功能。 – BrenBarn

+0

一個公平的想法,但不幸的是,如果我有多個昂貴的操作需要創建墊片,那麼這個想法並不會擴展。 – merlin2011

+1

[pylint](https://pypi.python。org/pypi/pylint)呢? – user2357112

回答

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

假設只有靜態依賴關係? – merlin2011

+3

@ merlin2011:在這種情況下,[pylint](http://pylint.org)應該這樣做 – Eric

2

有一個叫snakefood模塊:

生成Python代碼

依賴關係圖它採用AST解析 的Python文件。

這是非常可靠的,它總是運行。 沒有模塊是加載的 。加載模塊以找出依賴關係幾乎總是存在 問題,因爲很多代碼庫在全局名稱空間中運行初始化代碼,這往往需要額外的設置。 Snakefood是 保證不會有這個問題(它只是運行,不管是什麼)。

您可以通過調用sfood-imports <script.py>來獲取進口清單。然後您可以逐個導入列表中的每個模塊並查看它是否拋出ImportError。或者僅使用pylint。從文檔報價:

錯誤檢測

檢查,如果聲明的接口被真正落實

檢查,如果模塊均採用進口

希望有所幫助。

相關問題