再读PEP8
上次读PEP8还是很多年前的事情了,现在重新读一下,看看有没有新的收获
简介
本文档给出了构成主要Python发行版中标准库的Python代码的编码约定。
很多项目有自己的编码规定,优先权更高。
- 代码的可读性非常重要
- 代码规范可以在项目中获得一致性
代码布局
缩进
每层缩进使用4个空格
连续行应该使用python的隐式行连接或者使用悬挂缩进,若使用悬挂缩进需要注意上下对齐
在多行结构中,右括号应该在列表最后一行的非空字符的下方
每行最大长度
每行最多79个字符
利用
\换行
在操作符之前还是之后换行?
- 在操作符之前换行,这样可以很清楚的看出来哪些被
+ - * /了
空行
- 在
class之前使用两行空行,类中定义的method使用一行空行
源文件编码
- UTF-8
导入包
- 导入包不能写在同一行
- 导入包的顺序:标准库,相关的第三方库,本地库
- 绝对导入的方式更具有可读性,例如:
import mypkg.sibling - 不过在处理非常复杂的包导入的过程中,可以使用相对导入,例如:
from . import sibling - 避免使用
from <module import *>
模块级别的内置属性
__all__, __author__, __version__之类的模块级别的内置属性,需要写在模块文档后,import语句之前
字符串引号
- 单引号或双引号都可以
表达式和语句中的空格
避免不必要的空格
- 紧接在括号和大括号里面的空格
- 在逗号和后括号之间
- 在逗号,分号,冒号前的
- 切片操作中,两边都不需要空格
- 函数调用的左括号前
- 紧接在索引或切片之前
- 赋值操作符两边只能各一个空格,对齐
其它建议
- 避免尾随空格
- 始终在
+=, -= ==, <, >, !=, <>, <=, >=, in, not in, is, is not, and, or, not两边使用一个空格 - 如果使用不同优先级的操作符,在优先级最低的操作符的两边附上空格,例如正确写法:
hypot2 = x*x + y*y - 函数注释注意冒号的空格,例如正确写法:
def munge(input: AnyStr): ...和def munge() -> PosInt: ... - 当用于指示函数关键字参数和未注释的的函数参数的默认值的时候,不要在
=两边使用空格 - 当将函数参数和默认值结合使用时,在
=两边使用空格,例如正确写法:def munge(sep: AnyStr = None): ...和def munge(input: AnyStr, sep: AnyStr = None, limit=1000): ... - 不建议将多行语句写在同一行
什么时候使用逗号
注释
- 块注释:
- 行注释:至少有两个空格与语句隔开,
#后面跟一个空格,并且注释首字母大写 - 文档字符串:一个注释来描述该方法的功能,位于
def语句后面
命名规范
需要避免的命名方式
- 以
l或O或I作为单个字符变量名 - 如果想用
l的话,可以使用L替代
包和模块的名字
- 模块需要使用简短的,全小写的名字,可以使用下划线
- 包需要使用简短的,全小写的名字,不能使用下划线
类的名字
- 需要使用
CapWords的约定
异常名字
- 异常本身也是一个类,所以需要遵循类的命名方式
- 异常名需要以
Error为后缀
全局变量名字
函数名和变量名
- 函数名应该是小写的,必要时可以使用下划线
- 变量名应该遵循函数名的命名方式
函数和方法的参数
- 使用
self作为实例方法的第一个参数 - 使用
self作为类方法的第一个参数 - 如果函数参数的名称与保留的关键字冲突,则可以在其后加上一个下划线,例如
class_要比clss更好
方法名称和实例变量
- 对于非公共方法,在其前面加上一个下划线
常量
- 常量通常是在模块级别定义,使用全大写字母和下划线,例如:
MAX_OVERFLOW和total
编程建议
- 和
None作比较的话,需要使用is和is not,不能使用== - 使用
is not而不是not ... is - 如果你的意思是
if x is not none,不能写成if x - 使用
def语句而不是赋值语句来将一个lambda表达式直接绑定到一个标识符:正确的方式:def f(x): return 2*x - 对于
try语句,尽量限制try中的代码量,来避免其掩盖错误 - 返回值:要么函数中所有的
return都有返回值,要么都没有返回值,如果任意一个返回语句保持一致,那么任意没有返回值的返回语句应该明确指出return None - 使用
''.startwith()和''.endwith()而不是字符串切片方法来检查前缀和后缀 - 用
isinstance()来判断某个实例是否是对象的实例 - 对于序列(字符串,列表,元组),注意到空序列是
false,可以用来判断序列是否是空:if not seq:,if seq: - 不能使用
==来和True或False判断,正确的方式:if greeting: try ... finally ...中不要使用return- 掌握函数注释方法和变量注释方法
- 标题: 再读PEP8
- 作者: Oliver xu
- 创建于 : 2020-08-13 19:07:50
- 更新于 : 2025-10-23 21:07:23
- 链接: https://blog.oliverxu.cn/2020/08/13/再读PEP8/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论