命名风格
- b(单个小写字母)
- B(单个大写字母)
- lowercase 小写字母
- lower_case_with_underscores 使用下划线分隔的小写字母
- UPPERCASE 大写字母
- UPPER_CASE_WITH_UNDERSCORES 使用下划线分隔的大写字母
- CapitalizedWords(或者叫 CapWords,或者叫CamelCase 驼峰命名法 —— 这么命名是因为字母看上去有起伏的外观5)。有时候也被称为StudlyCaps。
- 注意:当在首字母大写的风格中用到缩写时,所有缩写的字母用大写,因此,HTTPServerError 比 HttpServerError 好。
- mixedCase(不同于首字母大写,第一个单词的首字母小写)
- Capitalized_Words_With_Underscores(巨丑无比!)
命名约定
-
Names to Avoid 应避免的名字
永远不要使用字母‘l’(小写的L),‘O’(大写的O),或者‘I’(大写的I)作为单字符变量名。
在有些字体里,这些字符无法和数字0和1区分,如果想用‘l’,用‘L’代替。
-
Package and Module Names 包名和模块名
模块应该用简短全小写的名字,如果为了提升可读性,下划线也是可以用的。Python包名也应该使用简短全小写的名字,但不建议用下划线。
当使用C或者C++编写了一个依赖于提供高级(更面向对象)接口的Python模块的扩展模块,这个C/C++模块需要一个下划线前缀(例如:_socket)
-
Class Names 类名
类名一般使用首字母大写的约定。
在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。注意,对于内置的变量命名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量。
-
Exception Names 异常名
因为异常一般都是类,所有类的命名方法在这里也适用。然而,你需要在异常名后面加上“Error”后缀(如果异常确实是一个错误)。 -
Function Names 函数名
函数名应该小写,如果想提高可读性可以用下划线分隔。
大小写混合仅在为了兼容原来主要以大小写混合风格的情况下使用(比如 threading.py),保持向后兼容性。
-
Function and method arguments 函数和方法参数
始终要将 self 作为实例方法的的第一个参数。
始终要将 cls 作为类静态方法的第一个参数。
如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此 class_ 比 clss 更好。(也许最好用同义词来避免这种冲突)
-
Constants 常量
常量通常定义在模块级,通过下划线分隔的全大写字母命名。例如: MAX_OVERFLOW 和 TOTAL。
-
始终使用def表达式,而不是通过赋值语句将lambda表达式绑定到一个变量上。
推荐:
def f(x): return 2*x不推荐:
f = lambda x: 2*x -
当捕获到异常时,如果可以的话写上具体的异常名,而不是只用一个except: 块。
比如说:try: import platform_specific_module except ImportError: platform_specific_module = None -
返回的语句保持一致。函数中的返回语句都应该返回一个表达式,或者都不返回。如果一个返回语句需要返回一个表达式,那么在没有值可以返回的情况下,需要用 return None 显式指明,并且在函数的最后显式指定一条返回语句(如果能跑到那的话)。
推荐:
def foo(x): if x >= 0: return math.sqrt(x) else: return None def bar(x): if x < 0: return None return math.sqrt(x)不推荐:
def foo(x): if x >= 0: return math.sqrt(x) def bar(x): if x < 0: return return math.sqrt(x) -
使用
.startswith()和.endswith()代替通过字符串切割的方法去检查前缀和后缀。startswith()和endswith()更干净,出错几率更小。比如:
推荐:
if foo.startswith('bar'):糟糕:
if foo[:3] == 'bar': -
对象类型的比较应该用isinstance()而不是直接比较type。
正确:
if isinstance(obj, int):糟糕:
if type(obj) is type(1): -
当检查一个对象是否为string类型时,记住,它也有可能是unicode string!在Python2中,str和unicode都有相同的基类:basestring,所以你可以这样:
if isinstance(obj, basestring):⚠️ 注意,在Python3中,unicode和basestring都不存在了(只有str)并且bytes类型的对象不再是string类型的一种(它是整数序列)
-
对于序列来说(strings,lists,tuples),可以使用空序列为false的情况。
正确:
if not seq: if seq:糟糕:
if len(seq): if not len(seq): -
不要用 == 去和True或者False比较:
正确: if greeting: 糟糕: if greeting == True: 更糟: if greeting is True: -
如果代码希望对功能注释有不同的用途,建议在文件的顶部增加一个这种形式的注释:
# type: ignore
评论
发表评论