python编程规范
python编程规范缩进换行Imports 导入模块级的“呆”名表达式和语句中的空格其他建议注释命名约定公共和内部的接口编程建议
缩进
-
每一级缩进使用4个空格
-
续行应该与其包裹元素对齐,要么使用括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐
-
用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行
# 与左括号对齐
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 用更多的缩进来与其他行区分
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# 挂行缩进应该再换一行
foo = long_function_name(
var_one, var_two,
var_three, var_four)
# 在条件判断的语句添加额外的缩进
if (this_is_one_thing
and that_is_another_thing):
do_something()
空格是首选的缩进方式,直接禁止使用tab键
换行
# 推荐:运算符和操作数很容易进行匹配
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
-
顶层函数和类的定义,前后用两个空行隔开。
-
类里的方法定义用一个空行隔开。
-
相关的功能组可以用额外的空行(谨慎使用)隔开。
Imports 导入
-
导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。
导入应该按照以下顺序分组:
-
标准库导入
-
相关第三方库导入
-
本地应用/库特定导入
-
你应该在每一组导入之间加入空行。
-
-
推荐使用绝对路径导入
-
避免通配符的导入(from import *)
模块级的“呆”名
“呆名“(名字里有两个前缀下划线和两个后缀下划线)必须出现在除文档字符串之外的其他代码之前。
"""This is the example module.
This module does stuff.
"""
from __future__ import barry_as_FLUFL
__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'
import os
import sys
表达式和语句中的空格
在下列情况下,避免使用无关的空格:
-
紧跟在小括号,中括号或者大括号后
-
紧贴在逗号、分号或者冒号之前
-
紧贴在函数参数、索引、切片的左括号之前
Yes: spam(ham[1], {eggs: 2})
No: spam( ham[ 1 ], { eggs: 2 } )
Yes: if x == 4: print x, y; x, y = y, x
No: if x == 4 : print x , y ; x , y = y , x
Yes: spam(1)
No: spam (1)
Yes: dct['key'] = lst[index]
No: dct ['key'] = lst [index]
其他建议
-
避免在尾部添加空格。
-
总是在二元运算符两边加一个空格:赋值(=),增量赋值(+=,-=),比较(==,<,>,!=,<>,<=,>=,in,not,in,is,is not),布尔(and, or, not)。
-
如果使用具有不同优先级的运算符,请考虑在具有最低优先级的运算符周围添加空格。有时需要通过自己来判断;但是,不要使用一个以上的空格,并且在二元运算符的两边使用相同数量的空格。
-
在制定关键字参数或者默认参数值的时候,不要在=附近加上空格。
-
功能型注释应该使用冒号的一般性规则,并且在使用->的时候要在两边加空格。
# √
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
def complex(real, imag=0.0):
return magic(r=real, i=imag)
# ×
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
注释
-
若注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,且每句话结束有个句号。
-
在句尾结束的时候应该使用两个空格。
-
块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别。
-
有节制地使用行内注释。行内注释是与代码语句同行的注释。行内注释和代码至少要有两个空格分隔。注释由#和一个空格开始。
-
多行文档说明使用的结尾三引号应该自成一行。
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
""" -
对于单行的文档说明,尾部的三引号应该和文档在同一行。
命名约定
-
类名首字母大写
-
函数名应小写,若想提高可读性,可用下划线分隔
-
始终要将 self 作为实例方法的的第一个参数
-
始终要将 cls 作为类静态方法的第一个参数
-
如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此 class_ 比 clss 更好。(也许最好用同义词来避免这种冲突)
-
使用下划线分隔小写单词以提高可读性
-
常量通常定义在模块级,通过下划线分隔的全大写字母命名。例如: MAX_OVERFLOW 和 TOTAL
公共和内部的接口
-
模块应该使用
__all__
属性显式地在它们的公共API中声明名称。将__all__
设置为空列表表示模块没有公共API。 -
即使通过
__all__
设置过,内部接口(包,模块,类,方法,属性或其他名字)依然需要单个下划线前缀。
编程建议
-
和像None这样的单例对象进行比较的时候应该始终用 is 或者 is not,永远不要用等号运算符
-
始终使用def表达式,而不是通过赋值语句将lambda表达式绑定到一个变量上
# √
def f(x): return 2*x
# ×
f = lambda x: 2*x -
返回的语句保持一致。函数中的返回语句都应该返回一个表达式,或者都不返回。如果一个返回语句需要返回一个表达式,那么在没有值可以返回的情况下,需要用 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() 代替通过字符串切割的方法去检查前缀和后缀
-
对象类型的比较应该用isinstance()而不是直接比较type
正确: if isinstance(obj, int):
糟糕: if type(obj) is type(1): -
不要用 == 去和True或者False比较
正确: if greeting:
糟糕: if greeting == True:
更糟: if greeting is True: -