2014-09-28 54 views
1

這是一個概念性的問題,而不是一個實際的問題,我想問一個偉大的互聯網大羣人的反饋意見。Python - 我應該使用下劃線別名嗎?

# Module a: 
import b 
__all__ = ['f'] 
f = lambda: None 

這可以讓你做到這一點:

我們都知道進口模塊該模塊的命名空間最終

import a 
a.b # <- Valid attribute 

有時候,這是偉大的,但大部分進口的副作用您的模塊提供的功能。在上面的例子中,我並不是想將b作爲a調用者的有效接口。

爲了抵消我們做:

import b as _b 

這標誌着進口爲私有。但是我無法在任何地方找到這種做法,PEP8也沒有談到使用別名來標記進口是私人的。所以我認爲這不是通常的做法。但是從某個角度來說,我認爲它在語義上更清晰,因爲它清除了模塊中暴露的部分,只留下了實際意義要暴露的相關接口。使用自動完成的IDE工作,它使得建議的列表更加輕薄。

我的問題歸結爲如果你已經看到使用該模式?它有名字嗎?哪些論據會反對使用它?

我還沒有成功使用__all__功能來隱藏b導入。我使用的是PyCharm,沒有看到自動完成列表的變化。

E.g.從一些模塊,我可以這樣做:

import a 

並自動完成框同時顯示bf

回答

2

雖然馬亭皮特斯說,沒有人實際使用下劃線隱藏模塊導入,這是不完全正確。這種技術的痕跡可以很容易地在Python的標準庫本身中看到(請參閱related question)。讓我們來看看它:

$ git clone --depth 1 [email protected]:python/cpython.git 
$ cd cpython/Lib 
$ find -iname '*.py' | xargs grep 'as \+_' | wc -l 
183 
$ find -iname '*.py' | xargs grep '^import' | wc -l 
4578 

因此,所有進口的約4%的下劃線前綴 - 不是多數,但還遠沒有「任何人」。在numpymatplotlib包中也有一些示例。

對我來說,這種導入下劃線是唯一的導入模塊的正確方式,而不公開暴露。不幸的是,它完全破壞了代碼外觀,所以很多開發人員都避免使用它。但它比__all__方法有一些優點:

  • 圖書館用戶可以決定名稱是否是私人的,只需查看名稱就可以查閱文檔。展望__all__而不是足以告訴公衆,因爲一些公開名稱可能沒有在那裏列出。
  • 不需要維護代碼實體名稱的重構不友好列表。

的結論,既_name__all__只是普通的邪惡,但實際上需要固定的東西是Python的模塊系統,「simple is better than complex」口頭禪的印象設計。例如,比較模塊在Haskell中的行爲方式。

UPD:
它看起來像PEP-8已經在其「Public and internal-interfaces」部分已經回答了這個問題:

即使__all__適當設置,內部接口(封裝,模塊,類,函數,屬性或其他名稱)仍應以前導下劃線作爲前綴。

2

沒有人使用該模式,它沒有命名。

這是因爲適當方法使用的是明確標註與__all__變量導出的名稱。 IDE將遵循這個變量,像help()這樣的工具。

引述import statement documentation

公共名由被檢查模塊的名爲__all__變量的命名空間確定的模塊定義;如果定義了它,它必須是由該模塊定義或導入的名稱的字符串序列。 __all__中給出的名稱都被認爲是公開的,並且必須存在。如果未定義__all__,則公用名稱集合將包含模塊名稱空間中的所有名稱,該名稱不以下劃線字符開頭('_')。 __all__應該包含整個公共API。它旨在避免意外導出不屬於API的項目(,例如在模塊中導入和使用的庫模塊)。

(Emphasis mine)。

另見Can someone explain __all__ in Python?

+0

我想我是在一些誤解之下,我以爲'__all__'只涉及'from一個import *'模式?這是我從鏈接中得出的結論,也是我通過SO搜索過的。 在PyCharm當我做一個'__all__'進入它不會改變自動完成框,當我做一個正常的'進口了' 例如爲: 模塊: 從。進口b __all__ = [ 'F'] F =拉姆達:無 (模塊B是空的)從另一個模塊我可以做現在 :從 。導入一個 自動完成框顯示'b'和'f'。 – 2014-09-28 00:44:57

+1

@JonLauridsen:'from modulename import *'模式是'__all__'的一個*用例。如果PyCharm仍然爲'__all__'中未列出的名稱提供自動完成,這可能被認爲是PyCharm中的一個錯誤。 – 2014-09-28 00:49:13

+0

嗯,那樣做是的.. 好吧,我創建了一個缺陷@ http://youtrack.jetbrains.com/issue/PY-14022,我們將看到會發生什麼!謝謝。 – 2014-09-28 00:55:55