代码布局
缩进
每个缩进级别使用4个空格
多行结构上的右大括号/方括号/括号可以在列表最后一行的第一个非空白字符下排列,如下所示:

或者它可能排列在开始多行构造的行的第一个字符下,如下所示:

每行字符数限制为 79 个字符(文档字符串/注释限制为 72 个)。超过使用换行处理。
带运算符的换行


空行
用两个空行包围顶级函数和类
类中方法定义被一个空行包围
可以谨慎的使用空白行来分隔相关功能组
谨慎的再函数使用空行来指示逻辑部分
import
导入应该放在文件顶部,在模块注释和文档字符串之后,模块全局变量和常亮之前
导入应按以下顺序分组:
1.标准库导入
2.相关第三方库导入
3.本地应用程序/库导入
并在每组导入之前放一个空行
导入不同的模块应该写在不同的行

从同个地方导入不同的内容,可以写在同一行

Dunder
模块级别的“dunders”(即带有两个前导和两个下划线的名称),例如__all__, __author__,__version__等应该放在模块文档字符串之后,但在除 导入之外的任何导入语句之前。

空格
在以下情况避免多余的空格
紧接在圆括号、方括号或大括号内:

在结尾的逗号和后面的右括号之间:

紧接在逗号、分号或冒号之前:

但是,在切片中,冒号的作用类似于二元运算符,并且两边的数量应该相等(将其视为具有最低优先级的运算符)。在扩展切片中,两个冒号必须应用相同数量的间距。例外:当省略切片参数时,将省略空格:

紧接在开始函数调用的参数列表的左括号之前:

在开始索引或切片的左括号之前:

赋值(或其他)运算符周围有多个空格以将其与另一个对齐:

避免在任何地方出现尾随空格
始终在这些二元运算符两边用一个空格括起来:赋值 ( =)、扩充赋值 (+=等-= )、比较 ( ==, <, >, !=, <>, <=, >=, in, , , ) 布尔值 ( , , )。
如果使用具有不同优先级的运算符,请考虑在具有最低优先级的运算符周围添加空格。

=当用于指示关键字参数或用于指示未 注释函数参数的默认值时,请勿在符号周围使用空格:

=但是,在将参数注释与默认值组合时,请在符号周围使用空格:

不鼓励复合语句


虽然有时可以将带有小主体的 if/for/while 放在同一行,但切勿对多子句语句执行此操作。


注释
与代码相矛盾的注释比没有注释更糟糕。当代码更改时,请始终优先更新评论!
注释应该是完整的句子。
块注释通常由一个或多个由完整句子组成的段落组成,每个句子都以句点结尾。
在多行注释中,除了最后一句之后,应该在句末句点后使用两个空格。
注释应该是清晰易懂的。
在不确定阅读你的代码人员是否会中文时,用英语写注释
块注释
块注释通常适用于跟随它们的部分(或全部)代码,并且缩进到与该代码相同的级别。块注释的每一行都以一个#和一个空格开头(除非它是注释内的缩进文本)。
单行注释
单行注释应与语句至少间隔两个空格。以#和一个空格开头。建议少使用单行注释。


文档注释
为所有公共模块、函数、类和方法编写文档注释。非公共方法不需要文档注释,但应该有一个注释来描述该方法的作用。此注释应出现在该def行之后。
请注意,最重要的是""",结束多行文档字符串的 应该单独一行:

对单行文档注释,保持"""写在同一行:

命名
要避免的名字
切勿使用字符“l”(小写字母 el)、“O”(大写字母 oh)或“I”(大写字母 eye)作为单字符变量名。
在某些字体中,这些字符与数字 1 和 0 无法区分。当想使用“l”时,请改用“L”。
包和模块名称
模块应该有简短的全小写名称。如果提高可读性,可以在模块名称中使用下划线。
Python 包也应该有简短的全小写名称,尽管不鼓励使用下划线。
类名
类名通常应使用 CapWords 约定。
在接口被记录并主要用作可调用的情况下,可以使用函数的命名约定。
请注意,内置名称有一个单独的约定:大多数内置名称是单个单词(或两个单词一起运行),CapWords 约定仅用于异常名称和内置常量。
类型变量名称
类型变量的名称通常应使用 CapWords 首选短名称:T, AnyStr, Num。建议添加后缀_co或_contra用于相应声明协变或逆变行为的变量:

全局变量名
(我们希望这些变量只在一个模块中使用。)与函数的规则大致相同。
函数和变量名
函数名称应为小写,必要时用下划线分隔单词以提高可读性。
变量名遵循与函数名相同的约定。
混合大小写只允许在已经是流行样式的上下文中(例如 threading.py),以保持向后兼容性。
函数和方法参数
始终self用于实例方法的第一个参数。
始终cls用于类方法的第一个参数。
如果函数参数的名称与保留关键字发生冲突,通常最好在结尾附加一个下划线,而不是使用缩写或拼写错误。因此class_优于clss。(也许更好的是通过使用同义词来避免这种冲突。)
方法名称和示例变量
使用函数命名规则:小写单词,必要时用下划线分隔以提高可读性。
仅对非公共方法和实例变量使用一个前导下划线。
为避免与子类发生名称冲突,请使用两个前导下划线来调用 Python 的名称修饰规则。
Python 将这些名称与类名相混淆:如果类 Foo 有一个名为 的属性__a,则它不能被Foo.__a. (坚持使用的用户仍然可以通过调用Foo._Foo__a.
常量
常量通常在模块级别定义,并以全大写字母书写,并用下划线分隔单词。示例包括 MAX_OVERFLOW和TOTAL。
编码建议
字符串相加减少对a+=b或a=a+b的使用,尽量使用''.join()
与 None 等单例的比较应始终使用 is not完成,而不应使用相等运算符,使用is not 而不是not...is;

始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句

捕获异常时,尽可能提及特定异常,而不是使用仅except:子句

一个好的经验法则是将仅“except”子句的使用限制在两种情况下:
1.如果异常处理程序将打印或记录回溯;至少用户会意识到发生了错误。
2.如果代码需要做一些清理工作,然后让异常向上raise。 try...finally 可能是处理这种情况的更好方法。
对于所有 try/except 子句,将该try子句限制为所需的绝对最小代码量。同样,这避免了掩盖错误

当上下文管理器执行获取和释放资源以外的操作时,应通过单独的函数或方法调用上下文管理器:

在返回语句中保持一致。函数中的所有 return 语句都应该返回一个表达式,或者它们都不应该返回。如果任何 return 语句返回一个表达式,则任何没有返回值的 return 语句都应将显式声明return None,并且显式 return 语句应出现在函数的末尾:

使用''.startswith()and''.endswith()而不是字符串切片来检查前缀或后缀。

对象类型比较应始终使用 isinstance() 而不是直接比较类型:

对于序列(字符串、列表、元组),使用空序列为假的事实:

不要使用以下方法将布尔值与 True 或 False 进行比较==:

不鼓励在try.... finally 套件中使用流控制语句return/break/contiue流控制语句会跳到finally之外。

网友评论