python编程规范
缩进
-
每一级缩进使用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: -
来源:oschina
链接:https://my.oschina.net/u/4415254/blog/4375325