2010-04-26 82 views
38

Python是否存在包的命名約定,如Java的com.company.actualpackage?大多數時候我看到簡單的,可能碰撞的軟件包名稱,如「web」。Python包名稱約定

如果沒有這樣的約定,是有它的一個原因?您如何看待在Python世界中使用Java命名約定?

回答

35

Python有兩個 「咒語」,涵蓋這個話題:

明確優於隱式。

命名空間是一個鳴喇叭偉大構想 - 讓我們做更多的這些!

The Python Style Guide(PEP 8)中可以找到模塊的命名和導入約定。

的最大原因,有沒有這樣的慣例在Java風格一致的前綴名稱的模塊,是因爲隨着時間的推移,你最終在你的代碼有很多重複的並不真正需要在那裏。

一個與Java的問題是它強迫你重複自己,不斷的。有很多模板可以用於Java代碼,而這在Python中並不是必需的。 (getter/setter方法是這方面的一個典型的例子。)

命名空間是沒有這麼多Python中的一個問題,因爲你可以在導入時給模塊的別名。如:

import com.company.actualpackage as shortername 

所以,你不僅能夠創建或操縱你的程序中的命名空間,但是能夠創建自己的按鍵節能別名也。

+4

+1與'as'關鍵字的別名 – n611x007 2013-05-09 11:35:36

1

我一直在使用python多年,我已經看到了從後起之秀新的開發嘗試命名文件「xml.py」碰撞的99.9%。我可以看到Java方案的一些優點,但大多數開發人員都足夠聰明,可以選擇合理的程序包名稱,所以它確實不是什麼大問題。

+0

的「xml.py」的問題(命名一個腳本,不小心隱藏了內置模塊)是由腳本被模塊*和*所查找模塊腳本的目錄,比非顯而易見的名字更加引起的。命名腳本'xml.py'的人通常不會期望它被導入'import xml'。 – 2010-04-26 13:55:42

+1

有經驗的開發人員不會命名腳本'xml.py'並期望執行'import xml',但我清楚地表明這對新開發人員來說是一個問題。 – mikerobi 2010-04-26 15:09:09

5

的原因有一般不包層次是因爲Python包不容易擴展的方式。包是實際的目錄,雖然你可以讓包看起來在多個子目錄中(通過將目錄添加到包的列表中),但這不方便,而且很容易做錯。至於爲什麼 Python包不容易以這種方式擴展,好吧,這是一個設計選擇。圭多不喜歡深層次的結構(現在仍然沒有),也不認爲他們是必要的。

的約定是挑選這是顯而易見的,但唯一的項目一個頂層包名稱 - 例如,項目本身的名稱。不管你想要什麼,你都可以把它裏面的所有東西都組織起來。(因爲你是在控制它)。把包分成獨立的所有者是多一點工作,但是有一些指導是可能的。這很少需要。

13

Java的約定也有它自己的缺點。並非每個開源軟件包都有一個穩定的網站。如果維護人員的網站更改,應該怎麼做?而且,使用這個方案的軟件包名稱會變得很長且很難記住。最後,包的名稱應該代表包的目的,而不是它的主人

+0

+1完全同意 – 2010-04-26 14:04:54

+0

使用域名的原因是在項目所有者的控制下使用名稱空間。但是,如果網站與軟件包名稱不同,這將會令人困惑... – deamon 2010-04-26 14:14:25

+1

@deamon答案中的問題是如果您沒有您控制的域名,您會做什麼 - 這對許多個人來說都是如此 – Mark 2010-04-26 17:03:30

7

沒有爲Python包沒有類似Java的命名約定。你當然可以爲你自己開發的任何軟件包採用一個,但是你可能必須侵入性地編輯你可能從第三方採用的任何軟件包,而且「文化上的異形」命名約定可能會削弱你自己的軟件包的變化被廣泛採用在你的組織之外。從技術上講,Java在Python中的約定沒有什麼問題(它只會使一些from陳述更長一些,沒什麼大不了的),但實際上文化方面使它幾乎不可行。

3

沒有什麼能阻止你使用約定,如果你想要的,但它不是在所有在Python世界標準,你可能會得到搞怪的表情。當它們深深地嵌套在com中時,關注管理包並沒有什麼樂趣。

這聽起來可能馬虎的人從Java的到來,但實際上它並沒有真正似乎造成任何大的困難,甚至是很差命名爲web.py.包

的地方,你經常做實踐 GET命名空間衝突是相對進口:其中代碼package.module1試圖import module2並有既有package.module2和標準庫module2(其中有通常被作爲STDLIB大和增長)。幸運的是,模糊的相對進口are going away

+1

Ehm,考慮到必須明確打開絕對導入,有意無意進行絕對導入而不是偶然導入相對導入。另一個常見的問題是:試圖從包含同名模塊的包中導入stdlib模塊。這不是由於缺少包層次結構(因爲你在那裏包中)而導致的,而是Python在3.x中的隱式相對導入。 – 2010-04-26 13:59:01

+0

啊,是的,同意......重新措辭。 – bobince 2010-04-26 14:01:47

2

對誰比誰來尋找這方面的更新:

截至2012年,PEP 423地址此。 PEP 8簡要介紹了該主題,但只是說:全部小寫或下劃線。

它的要點:挑選那些尚未PyPI上使用的難忘,有意義的名稱。