第4章 選擇好的名稱

4.1 PEP 8 和命名最佳實踐


4.2 命名風(fēng)格

Python中命名風(fēng)格有:

  • 每個單詞首字母大寫:CameCase
  • 第一個單詞首字母小寫其他單詞首字母大寫:mixedCase
  • 大寫:UPPERCASE和帶下劃線的大寫:ER_CASE_WITH_UNDERSCORES
  • 小寫:lowercase和帶下劃線的小寫:lower_case_with_underscores
  • 前綴:_leading和后綴:trailing_洒琢,或者都加下劃線:_doubled_

使用下劃線通常是縮寫詞。前綴和后綴下劃線用來標記私有和特殊的元素

這些風(fēng)格將被應(yīng)用到:

  • 變量
  • 函數(shù)和方法
  • 屬性
  • 模塊

4.2.1 變量

變量有兩種:常量帚呼、公有和私有變量

1. 常量

Python中對不會發(fā)生改變的全局變量(常量)紊服,使用大寫和下劃線:

MAX_SIZE = 1024

Python中并沒有常量危队,任何變量都是可以改變的习贫,只是約定一個常量來使用歉井。

即便是冗長的名稱送挑,但是能更好的理解:

ALL_WORDS_OF_FILE = 1024

使用常量時绑莺,將它們集中放在模塊的頭部是一個好辦法。

2. 命名和使用

對于張的像標志的選項惕耕,將它們和布爾操作組合是一種好方法:

In [1]: WHITE = 1 << 1

In [2]: BLUE = 1 << 2

In [3]: RED = 1 << 3

In [4]: def has_options(options, name):
   ...:     return bool(options & name)
   ...: 

In [5]: SET = BLUE | RED

In [6]: has_options(SET, BLUE)
Out[6]: True

In [7]: has_options(SET, WHITE)
Out[7]: False

In [8]: has_options(SET, RED)
Out[8]: True

每個值左移一位保證不會重復(fù)纺裁,使用'|'組合多個數(shù)字,使用'&'判斷是否在其中司澎。

3. 公有和私有變量

易變的私有變量和全局變量对扶,當(dāng)需要給保護時應(yīng)該使用小寫和一個前下劃線。

In [12]: _observers = []

In [13]: def add_observer(observer):
   ....:     _observers.append(observer)
   ....:     

In [14]: def get_observers():
   ....:     return tuple(_observers)
   ....: 
  • 對于函數(shù)和方法中的變量也是如此惭缰。
  • 對于類或?qū)嵗兞坷四希鳛楣驳囊徊糠郑⑶也荒軒砣魏斡杏玫男畔⒒蛘呷哂嗟那闆r下必須使用私有標志

只支持一個屬性的特性是好的私有成員:

In [17]: class Citizen(object):
   ....:     def __init__(self):
   ....:         self._message = 'Go boys'
   ....:     def _get_message(self):
   ....:         return self._message
   ....:     kane = property(_get_message)
   ....:     

In [18]: Citizen().kane
Out[18]: 'Go boys'

另一個就是對于只在類內(nèi)部使用的變量要加上前下劃線:

class TakePhoto(object):
    def __init__(self):
        self._people = []
    
    def add_person(self, name):
        self._people.append(name)
    
    def save_photo(self):
        for per in self._people:
            print per

4.2.2 函數(shù)和方法

函數(shù)和方法命名時應(yīng)該使用小寫和下劃線漱受。

1. 關(guān)于私有元素的爭論

  • 別使用前置雙下劃線表示私有特性
  • 不要大寫和下劃線混搭表示私有特性

2. 特殊方法

  • 不要使用_method_這樣的特殊命名法络凿。它們被用于操作符重載、容器定義等昂羡。它們應(yīng)該被集中放在類定義的最前面

3. 參數(shù)

  • 參數(shù)使用小寫絮记,如果需要可以加上下劃線

4.2.3 屬性

屬性名稱是小寫或者小寫加上下劃線命名,可以是一個名詞或者一個形容詞虐先,也可是一個小短語:

4.2.4 類

類名使用首字母大寫的命名規(guī)則怨愤,類和實例變量常常是名詞短語,私有類可以加上前下劃線蛹批。

4.2.5 模塊和包

模塊名稱都使用不帶下劃線的小寫字母命名撰洗,當(dāng)模塊對于包是私有的時候,將添加一個前下劃線腐芍。編譯過的C或C++模塊名稱通常帶有一個下劃線并且將帶入純的Python模塊中差导。


4.3 命名指南

4.3.1 使用“has”或“is”前綴命名布爾元素

當(dāng)一個元素使用起來是保存布爾值的時候,使用“is”和“has”前綴提供一個自然的方法猪勇,這樣更容易理解:

In [35]: class File(object):
   ....:     def __init__(self, filename):
   ....:         self._filename = filename
   ....:         self.is_open = False
   ....:     def open_file(self):
   ....:         self.is_open = True
   ....:     def has_open(self):
   ....:         return self.is_open
   ....:     

In [36]: file = File("content.txt")

In [37]: file.open_file()

In [38]: file.has_open()
Out[38]: True

4.3.2 使用復(fù)數(shù)形式命名序列元素

一個元素用來保存一個序列時设褐,用復(fù)數(shù)形式命名:

In [39]: class DB(object):
   ....:     connected_users = ['Tarek']
   ....:     tables = {'Customer' : ['id', 'first_name', 'last_name']}
   ....:    

4.3.3 用顯示的名稱和命名字典

變量用來保存一個映射時,使用顯示的名稱:

In [42]: person_address = {'Bill':'655 Monty Road', 'Pamela':'45 Python street'}

In [43]: person_address['Pamela']
Out[43]: '45 Python street'

4.3.4 避免通用名稱

不要使用諸如list泣刹、dict助析、sequence、elements會使得代碼難以閱讀理解和使用椅您。避免使用內(nèi)建的名稱外冀,防止帶當(dāng)前的命名空間被遮蔽。

#不好的命名
In [45]: def compute(data):
   ....:     for element in data:
   ....:         yield element * 12
   ....:   
   
#好的命名
In [46]: def display_numbers(number):
   ....:     for number in numbers:
   ....:         yield number * 12
   ....:  

4.3.5 避免現(xiàn)有的名稱

對關(guān)鍵字而言加上一個后下劃線是一種解決方法襟沮,class常常被改成klass或cls锥惋。


4.4 參數(shù)的最佳實踐

參數(shù)設(shè)計的三個原則:

  • 根據(jù)迭代設(shè)計構(gòu)建參數(shù)
  • 信任參數(shù)和測試
  • 小心是使用魔法參數(shù)*arg和 **kw

4.4.1 根據(jù)迭代設(shè)計構(gòu)建參數(shù)

一個函數(shù)有固定的昌腰、精心的設(shè)計參數(shù)列表會使代碼更健壯。這往往需要多個版本的迭代設(shè)計來構(gòu)建膀跌。它們應(yīng)該反應(yīng)創(chuàng)建該所有針對的使用場景遭商。

4.4.2 信任參數(shù)和測試

小心使用斷言

4.4.3 小心是使用魔法參數(shù)*arg和 **kw

  • 魔法參數(shù)或破壞函數(shù)或者方法的健壯性,會變成一個脆弱的函數(shù)或者方法捅伤。
  • 如果你的參數(shù)列表很長而且很復(fù)雜劫流,魔法參數(shù)很有誘惑力,但是這個函數(shù)更應(yīng)該被分解或者重構(gòu)

4.5 類名

類名必須簡潔丛忆、精明祠汇,并足以從中理解類所完成的工作。應(yīng)該使用表示其特性的類型或者特性的后綴.

  • SQLEngine
  • MimeTypes
  • StringWidget
  • TestCase
    基類可以使用BaseAbstract熄诡,例如:
  • BaseCookie
  • AbstractFormatter

4.6 模塊和包的名稱

模塊和包的名稱中可很,應(yīng)該體現(xiàn)出其內(nèi)容和用途。名稱要簡短凰浮、使用小寫字母我抠,不使用下劃線。
如果是一個協(xié)議的實現(xiàn)通常使用lib

  • smtplib
  • urllib
  • telnetlib
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袜茧,一起剝皮案震驚了整個濱河市菜拓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笛厦,老刑警劉巖纳鼎,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裳凸,居然都是意外死亡贱鄙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門登舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贰逾,“玉大人悬荣,你說我怎么就攤上這事菠秒。” “怎么了氯迂?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵践叠,是天一觀的道長。 經(jīng)常有香客問我嚼蚀,道長禁灼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任轿曙,我火速辦了婚禮弄捕,結(jié)果婚禮上僻孝,老公的妹妹穿的比我還像新娘。我一直安慰自己守谓,他們只是感情好穿铆,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斋荞,像睡著了一般荞雏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上平酿,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天凤优,我揣著相機與錄音,去河邊找鬼蜈彼。 笑死筑辨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幸逆。 我是一名探鬼主播挖垛,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秉颗!你這毒婦竟也來了痢毒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚕甥,失蹤者是張志新(化名)和其女友劉穎哪替,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菇怀,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凭舶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爱沟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帅霜。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呼伸,靈堂內(nèi)的尸體忽然破棺而出身冀,到底是詐尸還是另有隱情,我是刑警寧澤括享,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布搂根,位于F島的核電站,受9級特大地震影響铃辖,放射性物質(zhì)發(fā)生泄漏剩愧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一娇斩、第九天 我趴在偏房一處隱蔽的房頂上張望仁卷。 院中可真熱鬧穴翩,春花似錦、人聲如沸锦积。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽充包。三九已至副签,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間基矮,已是汗流浹背淆储。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留家浇,地道東北人本砰。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像钢悲,于是被迫代替她去往敵國和親点额。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容