PEP8规则:
==================================================
代码布局:
缩进:
每级缩进使用4个空格。
python -t # 警告非法的tab和space
python -tt #报错非法的tab和space
行宽:
限制所有行的最大宽度为79字符.
文档字符串或注释应该为72字符.
续航优先使用括号,其次使用续航符\.
空行:
函数和类的定义前面空2行。
类中的方法定义前面空1行。
不同的函数组合函数中不同的逻辑块可以使用额外的空行。
编码:
使用utf-8。
----------------------------------------------
括号中的垂直隐式缩进:
第一行有参数,对准左括号:
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) # 4
------------------------------------------------
括号中的悬挂缩进:
第一行没有参数
调用时,缩进4个空格:
foo = long_function_name(
var_one, var_two, # 4
var_three, var_four) # 4
/) # 右括号换行不用缩进
定义时,缩进 8个空格, 用于区别后续内容:
def long_function_name(var_one, var_two, var_three, # 8
var_four): # 8
/) # 右括号换行不用缩进
print(var_one) # 4
--------------------------------------------
if中的缩进:
if和(之间要空格, 括号中缩进8个空格。
if (this_is_one_thing
and this_is_another_thing): # 8
do_something() # 4
-------------------------------------------
列表的缩进:
my_list = [
1, 2, 3, # 4
4, 5, 6, # 4
] # 0
-------------------------------------------
导入:
导入位置:在模块注释和文档字符串之后,在模块全局变量和常量之前。
导入顺序:标准库,第三方库,本地库。
使用绝对路径导入,一行只导入一个单位,不使用通配符导入。
import name
from name import subname1, subname2
=============================================================
字符串引用:
单引号和双引号一行的,三引号的使用双引号,避免在字符串中使用反斜杆。
‘string’
“string”
“””string”””
=============================================================
表达式和语句中的空格:
左括号后面和右括号前面不要空格:
spam(ham[1], {eggs: 2})
逗号,分号,冒号之前不能有空格,之后有空格:
if x ==4: print x, y; x, y = y, x
索引操作符中的冒号前后都不要空格:
ham[1:9:3], ham[:9:3] # : 前后都不要空格
函数调用的左括号前面不能有空格:
spam(1) # 函数名和(之间不能有空格
赋值等操作符不能因为对齐添加多个空格:
x = 1 # = 前后各一个空格
二元运算符两边要有空格:
i = i + 1 # +前后有空格
submitted += 1 # =+前后有空格
优先级高的运算符前后不要空格:
x = x*2 – 1 # * 前后不要空格
c = (a+b) * (a-b) # +/- 前后不要空格
关键字参数和默认值参数前后不要空格:
def complex(real, imag=0.0): # =前后不要空格
return magic(r=real, i=imag) # =前后不要空格
函数注释中,=前后要有空格,冒号:和->前面没有空格,后面有空格。
def munge(input: AnyStr):
def munge(sep: AnyStr = None):
def munge()-> AnyStr
不推荐使用复合语句,也就是多条语句写在一行上。
if/for/while有时候可以在同一行跟一小段代码,但不要跟多个语句,也不要换行。
if foo == ‘blah’:
do_blan_thing()
do_one()
=============================================================
注释:
修改代码之前优先修改注释。
注释首字母大写,注释以#加一个空格开头。
尽量不要用行内注释,也就是和语句在一行。
# Convert tabs to spaces (following thenormal Python rules)
# and split into a list of lines:
文档字符串:
def kos_root():
“””Return the pathname of the KOS rootdirectory.”””
def complex():
“””Return a foobang
Optional plotz says to frobnicate thebizbaz first.
“”” # 单独一行
=============================================================
版本标签:
__version__ ="$Revision$"
=============================================================
命名约定:
b/B
lowercase/UPPERCASE
lower_case_with_underscores/UPPER_CASE_WITH_UNDERSCORES
CapitalizedWords #首字母大写的混合大小写
mixedCase #首字母小写的混合大小写
Capitalized_Words_With_Underscores #带下划线的首字母大写
常量/实例常量和缩写词都大写:
B
UPERCASE
UPPER_CASE_WITH_UNDERSCORES
私有的实例常量在前面加_单下划线。
变量/实例变量都小写:
b
lowercase
lower_case_with_underscores
私有的实例变量在前面加_单下划线。
下划线:
_single_leading_underscore #类的私有属性,from M import * 不会导入单下划线开头的东西。只有本身和子类可以访问。
single_trailing_underscore_ #单下划线结尾,避免和python的关键字冲突。
__double_leading_underscore #类的私有成员,只有本身可以访问。
__double_leading_and_trailing_underscore__ #不要使用。
不要使用单个的o和l,用于区别数字0和1。
模块名全部小写短名称,可用下划线:
lowercase_with_underscore
包名全部小写短名称,不用下划线:
lowercasewithoutunderscore
类和异常名首字母大写,异常需要在后面加Error:
class CapWords(object):
class CapWordsError(Exception):
函数名/方法名都是小写字母,可用下划线:
def lowercase_with_underscore()
私有的方法名前面加_单下划线。
函数和方法的参数:
普通函数参数:lower_case_with_underscores。
def instance_function(self, …) #实例方法第一个参数是self。
def class_function(cls, …) #类方法第一个参数是cls。
=============================================================
编程建议:
None的比较用is/is not 不要用=:
if foo is None/if foo is not None:
用is not不要 not … is。
使用基于类的异常。
使用函数定义def代替lambda赋值给标识符。
异常类继承自Exception,而不是BaseException。
适当使用异常链。
python2中用raise ValueError(‘message’)代替raise ValueError, ‘message’。
捕获异常时尽量指名具体异常。
建议用as绑定异常名。
捕捉操作系统错误时,建议使用Python 3.3引入显式异常层次,支持内省errno值。
所有try/except子句的代码要尽可的少,以免屏蔽其他的错误。
本地资源建议使用with语句,以确保即时清理。当然try /finally语句也是可以接受的。
上下文管理器在做获取和释放资源之外的事情时,应通过独立的函数或方法。
函数或者方法在没有返回时要明确返回None。
使用字符串方法而不是string模块。
使用 startswith()和endswith()代替字符串切片来检查前缀和后缀。
使用isinstance()代替对象类型的比较。
空序列(字符串,元组,列表)为false。
字符串后面不要有大量拖尾空格。
不要用 == 进行布尔比较。