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
基類可以使用Base或Abstract熄诡,例如: - BaseCookie
- AbstractFormatter
4.6 模塊和包的名稱
模塊和包的名稱中可很,應(yīng)該體現(xiàn)出其內(nèi)容和用途。名稱要簡短凰浮、使用小寫字母我抠,不使用下劃線。
如果是一個協(xié)議的實現(xiàn)通常使用lib:
- smtplib
- urllib
- telnetlib