第4章 选择好的名称

4.1 PEP 8 和命名最佳实践


4.2 命名风格

Python中命名风格有:

  • 每个单词首字母大写:CameCase
  • 第一个单词首字母小写其他单词首字母大写:mixedCase
  • 大写:UPPERCASE和带下划线的大写:ER_CASE_WITH_UNDERSCORES
  • 小写:lowercase和带下划线的小写:lower_case_with_underscores
  • 前缀:_leading和后缀:trailing_,或者都加下划线:_doubled_

使用下划线通常是缩写词。前缀和后缀下划线用来标记私有和特殊的元素

这些风格将被应用到:

  • 变量
  • 函数和方法
  • 属性
  • 模块

4.2.1 变量

变量有两种:常量、公有和私有变量

1. 常量

Python中对不会发生改变的全局变量(常量),使用大写和下划线:

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

每个值左移一位保证不会重复,使用'|'组合多个数字,使用'&'判断是否在其中。

3. 公有和私有变量

易变的私有变量和全局变量,当需要给保护时应该使用小写和一个前下划线。

In [12]: _observers = []

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

In [14]: def get_observers():
   ....:     return tuple(_observers)
   ....: 
  • 对于函数和方法中的变量也是如此。
  • 对于类或实例变量,作为公共的一部分,并且不能带来任何有用的信息或者冗余的情况下必须使用私有标志

只支持一个属性的特性是好的私有成员:

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'

另一个就是对于只在类内部使用的变量要加上前下划线:

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 函数和方法

函数和方法命名时应该使用小写和下划线。

1. 关于私有元素的争论

  • 别使用前置双下划线表示私有特性
  • 不要大写和下划线混搭表示私有特性

2. 特殊方法

  • 不要使用_method_这样的特殊命名法。它们被用于操作符重载、容器定义等。它们应该被集中放在类定义的最前面

3. 参数

  • 参数使用小写,如果需要可以加上下划线

4.2.3 属性

属性名称是小写或者小写加上下划线命名,可以是一个名词或者一个形容词,也可是一个小短语:

4.2.4 类

类名使用首字母大写的命名规则,类和实例变量常常是名词短语,私有类可以加上前下划线。

4.2.5 模块和包

模块名称都使用不带下划线的小写字母命名,当模块对于包是私有的时候,将添加一个前下划线。编译过的C或C++模块名称通常带有一个下划线并且将带入纯的Python模块中。


4.3 命名指南

4.3.1 使用“has”或“is”前缀命名布尔元素

当一个元素使用起来是保存布尔值的时候,使用“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 使用复数形式命名序列元素

一个元素用来保存一个序列时,用复数形式命名:

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会使得代码难以阅读理解和使用。避免使用内建的名称,防止带当前的命名空间被遮蔽。

#不好的命名
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 避免现有的名称

对关键字而言加上一个后下划线是一种解决方法,class常常被改成klass或cls。


4.4 参数的最佳实践

参数设计的三个原则:

  • 根据迭代设计构建参数
  • 信任参数和测试
  • 小心是使用魔法参数*arg和 **kw

4.4.1 根据迭代设计构建参数

一个函数有固定的、精心的设计参数列表会使代码更健壮。这往往需要多个版本的迭代设计来构建。它们应该反应创建该所有针对的使用场景。

4.4.2 信任参数和测试

小心使用断言

4.4.3 小心是使用魔法参数*arg和 **kw

  • 魔法参数或破坏函数或者方法的健壮性,会变成一个脆弱的函数或者方法。
  • 如果你的参数列表很长而且很复杂,魔法参数很有诱惑力,但是这个函数更应该被分解或者重构

4.5 类名

类名必须简洁、精明,并足以从中理解类所完成的工作。应该使用表示其特性的类型或者特性的后缀.

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

4.6 模块和包的名称

模块和包的名称中,应该体现出其内容和用途。名称要简短、使用小写字母,不使用下划线。
如果是一个协议的实现通常使用lib

  • smtplib
  • urllib
  • telnetlib
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容