再读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
- 更新于 : 2024-12-21 21:05:39
- 链接: https://blog.oliverxu.cn/2020/08/13/再读PEP8/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论