2014-07-19 40 views
-1

我認爲下面是不良作風:Python:如何確保導入來自定義模塊?

# In foo_pkg/bla_mod.py: 
magic_value=42 

# In foo_pkg/bar_mod.py: 
from .bla_mod import magic_value 

# In doit.py: 
from foo_pkg.bar_mod import magic_value 

相反,我想,要總是從它已被定義的模塊,也就是在這種情況下導入對象:

# In doit.py: 
from foo_pkg.bla_mod import magic_value 

手動查找這類問題非常快速(對於每個導入的對象,您必須打開模塊並檢查它是否定義了對象,或者是否從另一個模塊導入)。

什麼是自動執行此檢查的最佳方法?令我驚訝的是,pylint和pyflakes都沒有合適的檢查器,但是也許還有另外一種工具(或者甚至可以用於Python本身的一些技巧)?

問題陳述簡而言之:給定一堆python源文件,從模塊中找到對象本身並不定義該對象的每一次導入。

我知道有一些庫(包括標準庫),其中一個模塊提供主要的外部API並從內部從其他模塊導入必要的符號。然而,在我正在使用的代碼庫中並非如此,這裏是我真正想要消除的重構工件。

+4

被警告:這是很常見的模塊,以故意這樣做。例如,'collections.defaultdict'實際上是從'_collections'模塊中導入到'collections'中的。查看源代碼:http://hg.python.org/cpython/file/2.7/Lib/collections.py這可能就是爲什麼你看到的工具沒有檢查器。 – user2357112

+0

我可能會指定['__all__' list](http://stackoverflow.com/questions/44834/can-someone-explain-all-in-python)或確保所有不應該是部分一個模塊的公共API是用一個前導下劃線(例如'from .bla_mod import magic_value as _magic_value')定義的。任一行爲都會指定模塊的哪些部分位於其公共API中(特別是,「import *」會忽略非公共部分)。然後,我試圖找到檢查導入非公共模塊內容的檢查器。 – user2357112

回答