00 | 写在前面
可读性一直是Python语言设计的核心,因为通常情况下,阅读代码的需求比编写代码的需求更频繁。
以自己为例,当实现一个自主设计的异常检测算法后,经常需要根据其实际场景测试表现,反馈调整修正部分核心代码,此时若代码本身结构混乱、注释繁冗,必然导致耗费更多重复性时间成本理解代码逻辑与功能,从而拉低了实验效率。
为了确保自己和团队今后所写代码均具有较高的可读性、一致性与复用性,首先来学习确定今后Python编码的风格规范。
01 | PEP 8
要说Python编码风格规范,自然首推《Python Enhancement Proposal #8》(8号Python增强提案,也简写为PEP 8)。
PEP 8中列出了许多细节以描述如何撰写清晰的Python代码,且会随着Python语言持续更新。如果大家有时间,建议仔细阅读整份指南;若是时间有限,则可以阅读本篇笔记提炼的规范要点。
011 | 关于空白(Whitespace)的使用规范
Python中空白会影响代码的含义与清晰程度,因此使用时应尤其在意:
- 使用空格(space)来表示缩进,通常和语法有关的每一层缩进应使用4个连续空格,若习惯使用tab键,则应设置“1 Tab=4 space”
- 每行代码不宜过长,尤其不要超过79字符,可以使用“\”或“()”进行跨行分割;且多行代码跨行时,除去首行外其余各行均应在正常缩进级别之上再加4个空格以区分
- 函数与类之间应使用2个空行分隔开,同一个类中各方法之间使用一个空行分隔
- 下标[*]中不需要添加空格
- 为变量赋值时,赋值符号的左侧和右侧应该各自写上一个空格
012 | 关于命名的使用规范
PEP 8提倡采用不同的命名风格来编写Python代码,以便在阅读代码时可由命名辨别其功能角色。
- 函数、变量即属性应该用小写字母拼写,各单词之间以下划线相连,如
student_score
- 类与异常应该以每个单词首字母均大写的形式来命名,亦成为驼峰式命名,如
Student_Infomation
- 模块级别的常量应该全部采用大写字母拼写,各单词之间以下划线相连
- 受保护的实例属性,应以单个下划线开头;私有实例属性,应以两个下划线开头
- 类中的实例方法应该把首个参数命名为self以表示该对象自身;而类方法应把首个参数命名为cls以表示该类自身
013 | 关于表达式的使用规范
《The Zen of Python》中说道“每件事都应该有直白的做法,而且最好只有一种。”将其贯彻在Python表达式和语句风格上,通常要求:
- 不要通过检测长度的方法来判断列表是否为空值,而应该采用逻辑判断表达式;同理若检测某列表为非空值,同样建议使用逻辑表达式
[×] → if len(somelist) = 0
[√] → if not somelist # 此时somelist若为空值,自动判断为false;若为非空值,自动判断为true
- import语句应该总是放在文件开头,且按顺序引入三类模块:首先是标准库模块,其次是第三方模块,最后是自定义模块
- 采用内联形式的否定词,而不要把否定词放在整个表达式的前面,如
[√] → if a is not b
[×] → if not a is b
02 | PEP 8规范工具
完全掌握PEP 8所描述的Python风格规范需要一个迭代学习过程,然而现实中可能迫切需要生产出合乎PEP 8规范的代码,这时候可以使用Python提供的PEP 8检查与格式化工具。
较早版本Python中可以借助“pip/pip3 install pep8”来安装相应的规范化检查工具,最新的版本则建议使用“pip/pip3 install pycodestyle”,未来将使用“pycodestyle”逐步取代“pep8”。
当成功安装“pep8 or pycodestyle”后,即可输入命令“pep8/pycodestyle 目标文件.py”来进行规范性检查。
具体示例可见下图,其中检查后列出了目标文件不符合PEP 8规范的警告信息
按照上图中的警告,自己逐一对比了原始文件中的非规范之处,发现反复出现的其实只有几类问题:
- E303:函数/列表等参数/元素之间应采用“, + space”的形式分隔
- E231:代码段之间存在过多空行,一般2个空行即可,语句之间使用1个空行
- E305:函数与类定义之间应基于2个空行作为分隔
- E402:导入模块应放置于文件最开始,且按照标准模块、第三方模块与自定义模块的结构,按照字母顺序排列
- E501:每行不应超过79字符,过多时应换行缩进
具体代码错误如下图,个人觉得,以自己的实际代码为对象,对比分析与PEP 8的差异,可以更有针对性地提升个人编码的规范性。
03 PEP 20
PEP 20是编写Python程序的指导准则,与PEP 8相比,更侧重编码艺术。幸运地是PEP 20不需要费尽心思搜集,所有的Python版本中同样内嵌了PEP 20,通常只需要在python环境下输入“import this”即可看到PEP 20:
PEP 20需要在编码过程中体会不同功能的实现方式的优劣选择,留待日后慢慢体味感知吧!最后,奉上PEP 20的中文版本:
1. 优美胜于丑陋
2. 明确胜于隐晦
3. 简单胜于复杂
4. 复杂胜于难懂
5. 扁平胜于嵌套
6. 留白胜于紧凑
7. 可读性很重要
8. 特例也并不能特殊到可以违背这些原则
9. 实用性胜过纯粹性
10. 错误不应被默默忽略
11. 除非你明确地忽视
12. 面对歧义,不要尝试去猜测
13. 应该有一种——最好是仅有一种——明显的处理方式
14. 一开始那种方式并非显而易见,除非你是Python之父
15. 做,好过不做
16. 不假思索就动手还不如不做
17. 如果实现很难解释,那就不是个好思路
18. 如果实现易于解释,那可能是个好思路
19. 命名空间是个绝妙主意,我们要多多利用它!