再读PEP8

Oliver xu

上次读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语句后面

命名规范

需要避免的命名方式

  • lOI作为单个字符变量名
  • 如果想用l的话,可以使用L替代

包和模块的名字

  • 模块需要使用简短的,全小写的名字,可以使用下划线
  • 包需要使用简短的,全小写的名字,不能使用下划线

类的名字

  • 需要使用CapWords的约定

异常名字

  • 异常本身也是一个类,所以需要遵循类的命名方式
  • 异常名需要以Error为后缀

全局变量名字

函数名和变量名

  • 函数名应该是小写的,必要时可以使用下划线
  • 变量名应该遵循函数名的命名方式

函数和方法的参数

  • 使用self作为实例方法的第一个参数
  • 使用self作为类方法的第一个参数
  • 如果函数参数的名称与保留的关键字冲突,则可以在其后加上一个下划线,例如class_要比clss更好

方法名称和实例变量

  • 对于非公共方法,在其前面加上一个下划线

常量

  • 常量通常是在模块级别定义,使用全大写字母和下划线,例如:MAX_OVERFLOWtotal

编程建议

  • None作比较的话,需要使用isis 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 进行许可。
评论