PEP8--“Python Enhancement Proposal #8 is the style guide for how to format Python code”
摘自: Brett Slatkin. “Effective Python: 90 Specific Ways to Write Better Python, 2nd Edition。”
空白符
可以使用string.whitespace返回空白符号
for s in string.whitespace:
print(s.encode())
b' ' # 空格
b'\t' # 水平制表符
b'\n' # 换行符
b'\r' # 回车
b'\x0b' # 垂直制表符
b'\x0c' # 换页符
空白符在python中是重要的句式符号,python语法上对空白符敏感,在pep8中也做了这方面的规则指导:
- 缩进时使用空格而不是tab制表符
- 每级缩进使用4个空格
- 每行字符数不超过79
- 需要额外换行的长表达式换行的时候,应该在本级缩进下再缩进四个空格
- 在一个文件中,函数之间、类之间以及函数与类之间应该隔两行
- 在一个类中,方法之间应该隔一行
- 在一个字典中,key与冒号之间不要有空白符号,冒号与之后的value之间隔一个空格
- 在 = 前后有且仅有一个空格
- 在写类型注释时,变量名和冒号之间不要有空白符号,冒号与之后的类型信息之间隔一个空格
命名规则
PEP8建议在python中不同部分使用特定的命名方式,这样可以是的仅仅通过命名就能知道其类型。
- 函数名, 变量名, 以及属性名应该使用全部小写的下划线命名法
lowercase_underscore
- 受保护属性应该以单下划线开头
_leading_underscore
- 私有属性应该以双下划线开头
__double_leading_underscor
- 类名(以及异常名)应该使用以首字母大写的驼峰式
CapitalizedWord
命名 - 模块级的常量应该使用全部大写的下划线命名法
ALL_CAPS
- 类中的方法的第一个参数应该使用self,指类实例本身
- 类中的classmethod的第一个参数应该使用cls,指类本身
表达式和声明
There should be one—and preferably only one—obvious way to do it.
摘自: “The Zen of Python”
- 在行表达式中不要使用肯定式的否定,而是应该直接使用否定式
'''eg.'''
if not a is b: ... # very bad
if a is not b: ... # good
- 不要通过检查一个序列的长度来判断是否为空,而是应该直接使用
if *sequences*
来判断
'''eg.'''
if len(somelist) == 0: ... # very bad
if somelist: ... # good
- 避免在if/for/while/except等声明中将复合表达式写在一行中,请明确的将表达式分成多行
- 如果表达式一行写不完,用小括号括起来,然后写成多行并使用缩进
- *多行表达式推荐使用小括号括起来,而不是使用 \ *
Imports
- 将import放在文件顶部
- import顺序应该是:标准库模块 -> 三方模块 -> 自定义的模块,在这三类模块引入时应该按字母顺序引入
Tips
Pylint是一个流行的python源码静态分析工具,提供了PEP 8的自动强制检查和一些其他错误检查,很多IDE都提供了pylint支持。
VScode设置保存时自动格式化
- 安装yapf
pip install yapf
- 设置formatting.provider,打开 File—Preferences—Settings,在workspace搜索框中搜索“python.formatting.provider”,选择yapf
- 设置format on save,打开 File—Preferences—Settings,在workspace搜索框中搜索“format on save”,勾选中
- 完成,然后vscode就可以在保存文件时自动将代码按pep8进行格式化,撸码体验升级