2009-10-14 58 views
3

我正在尋找一種更好的方式來命名Python中的所有內容。是的,我讀過PEP8Spolsky’s wonderful rant和其他各種文章。但我正在尋找更多的選擇實際單詞的指導。實際選擇Python中的單詞的命名約定,符合PEP8

是的,我知道

愚蠢的一致性是小小的心靈的妖怪 。

但是,您可以保持與PEP8等一致,仍然沒有一致的變量/方法/類名易記。一致,我的意思是,如果你兩次被提交相同的決定,你會產生相同的名稱。

作爲一個例子,有多個PEP8兼容的方式來命名下列項目:

  • 數量的列在表中
  • 當前列號
  • 列對象
  • 列的總和

是的,當然,很容易做出決定使用像num_colcount_col而不是col_numcol_count(或v.v.)。但是,我希望看到一個隨着時間的推移而進行了一些測試/提煉的例子。我經常從一個特定的會議開始,然後在我冒險進入一個新區域時開始崩潰。

我想我所尋找的不僅僅是前綴/根/標籤/後綴應該做些什麼(這部分內容涵蓋了Spolsky文章中的匈牙利應用程序),但是(許多)每個例子或規則用於生成每個。

回答

4

我相信對複雜變量命名約定的需求會隨着良好的面向對象設計而消失。在Spolsky的文章中,重點在於變量命名如何幫助防止錯誤。我相信,當你在同一個範圍內有很多變量時,這些錯誤會更常發生;這可以通過將數據分組到對象中來避免 - 然後,單個命名上下文將只有幾個變量,這些變量不需要組合名稱。

命名約定的另一個目的是更好地記住名字。同樣,面向對象有助於(通過隱藏來自外部用戶的大量數據);你需要的是命名方法的約定,而不是數據。另外,工具可以幫助您提供一定範圍內的可用名稱列表(再次,這些工具依賴於面向對象來完成他們的工作)。

在你的具體例子中,如果列是一個對象,我期望len(table)給了我一個表中的列數,sum(column)column.sum()給我它的總和;而當前列只是for循環中的變量(通常是ccolumn)。

+0

重點關注最小化任何給定範圍內的變量數量的好處。這當然有幫助,但正如你所指出的,方法命名仍然是一個問題。特別是在使用長時間未使用的模塊時。一個好的IDE只能提供很多幫助。 – nazca 2009-10-14 13:34:07

1

宇宙是多維的。

對每個變量名都至少有兩個維度。

「總計」, 「伯爵」, 「列」, 「表中的」

「當前」, 「索引」, 「」, 「一列」

「電流」, 「列」, 「」, 「」

「求和」, 「東西」, 「」, 「在一列」

影響。這是不規則的。更糟糕的是,我們可以選擇任何東西作爲「主要」維度,並選擇任何其他特徵序列作爲「次要」維度。

更糟的是,我們可能有一個真正複雜的東西。 「總計」,「計數」,「非下劃線」,「列」,「在表格中」,「帶有偶數長度名稱」,「從字典中」,「鍵入」,「母親的孃家姓」。

坦率地說,沒有可能的變量名稱模式,它包含了系統化,可重複形式的「全部」知識。

儘管如此。直到有人發現一個反例,它總是很有趣和遊戲。

你可以繼續嘗試,或者你可以簡單地使用簡單,清晰的名字。如果你的名字範圍很小(例如一個小方法函數),沒有什麼可以「記住」。在構成方法功能的20行代碼中,它們都完美可見。

2

請記住,在英語中,當兩個含糊不清的單詞彼此相鄰時,第一個單詞變成描述第二個單詞的形容詞。嘗試堅持這一規則,並始終用兩個組件來命名事物,其中第一個組件描述第二個組件。

例如col_num是一個數字。什麼樣的號碼?列號。

下一條規則就是這個詞。這是一個很好的短語,所以請不要忽略它。多元化也是一樣。過去式結尾在-ed或-d中。甚至可能。

例如,num_col是一列。哪一種?一個數字列。如果你真的想引用列數,你應該寫num_of_cols。收到的日期是recd_date或rcvd_date,而不是rec_date或rcv_date。

說英語的讀者對單詞末尾的-s和-d非常敏感,並且對短語中間的單詞也很敏感,所以不要以爲短小的文本會被遺漏。這是不太可能的,因爲我們從很小的年齡開始編程,注意到一些單詞的結尾。

嘗試保持一致性,並保留任何單詞的詞彙表或數據字典或您使用的單詞片段。不要爲兩個不同的東西使用相同的片段。如果您使用recd來表示已收到,並且您需要一個變量名稱進行錄製,則可以將其全部寫出或提出一個新的縮寫並放入詞彙表中。如果您使用關係數據庫,請嘗試與那裏使用的命名約定保持一致。讓dba知道你在做什麼,並告訴他們在哪裏找到你的詞彙表。