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进行格式化,撸码体验升级