|
|
|
|
移动端

2.6.1 PEP 8编码规范介绍

《Python Linux系统管理与自动化运维》第2章Python生态工具,在本章中,我们将依次介绍Python生态的各种工具,包括:Python内置的小工具(2.1节);包管理工具pip(2.2节);Linux和Windows下的Python编辑器(2.3节);Python交互式编程工具(2.4节);Python调试器(2.5节);Python代码规范检查工具(2.6节)。本节为大家介绍PEP 8编码规范。

作者:赖明星来源:机械工业出版社|2017-09-28 16:24

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


2.6 Python代码规范检查

在这一小节里,我们将关注Python的代码风格。先介绍Python官方给出的编码规范PEP 8,然后介绍检查代码是否符合规范的工具pycodestyle,以及可以将代码风格格式化成PEP 8的autopep8。

2.6.1 PEP 8编码规范介绍

Python代码给人的第一印象就是颜值高、简洁优美、可读性强。这一方面是因为Python语言自身的优秀设计,如通过统一的缩进来表示代码块,通过减少多余的符号使得代码更加简洁;另一方面是因为Python代码有着较为统一的编码风格。在其他编程语言中,工程师们总是为了不同的编码风格争论不休,如大括号应该放在前一行的末尾还是后一行的行首、应该使用怎样的命名习惯、等号两边是否应该有空格等问题。代码风格问题在Python语言中讨论较少,这是因为,Python官方提供了一份编码风格指导手册,即PEP 8(https://www.python.org/dev/peps/pep-0008/)。PEP 8本身只是编码风格方面的建议,并不强制工程师遵循。但是,由于该建议被Python工程师广泛接纳,因此,它已经成为了事实上的标准。相应的,编写Python代码的编辑器自动提供PEP 8编码风格检查,在工程师的编码违反PEP 8规范时,会给出警告信息和修正建议。与此同时,还有专门的检查工具对Python的代码风格进行检查。

在Python生态中,除了PEP 8编码规范以外,还有google的Python编码指导。不过,主要的开源项目都是用PEP 8编码规范,主流的编辑器也默认提供PEP 8检查,PEP 8已经成为了事实上的标准。因此,建议大家编写Python代码的时候都遵循PEP 8编码规范,也完全没有必要在公司内部制定一套Python的编码风格指导手册。

PEP 8编码规范详细地给出了Python编码的指导,包括对齐规则、包的导入顺序、空格与注释、命名习惯和异常处理等Python编程的方方面面,并且提供了详细的示例。

下面以包导入为例,看一下PEP 8给出的具体编程指导。在Python中,import应该一次只导入一个模块,不同的模块应该独立一行,例如:

  1. import os  
  2. import sys 

反面例子:

  1. import sys, os 

如果要从一个模块导入多个API,也可以像下面这样:

  1. from subprocess import Popen, PIPE 

import语句应该处于源码文件的顶部,位于模块注释和文档字符串之后,全局变量和常量之前。导入不同的库时,应该按以下顺序分组,各个分组之间以空行分隔:

1)导入标准库模块;

2)导入相关第三方库模块;

3)导入当前应用程序/库模块。

例如,下面是一个私有项目的包导入规则。首先导入标准库模块,其次导入第三方模块,最后导入当前应用程序,各个分组之间以空行分隔。

  1. import time  
  2. import json  
  3.  
  4. import yaml  
  5. import psutil  
  6.  
  7. from mongo_agent.action.common import kill_mongod, start_mongo_node 

Python中支持相对导入和绝对导入,推荐使用绝对导入。因为绝对导入可读性更好,也不容易出错,即使出错也会给出更加详细的错误信息。如下所示:

  1. import mypkg.sibling  
  2. from mypkg import sibling  
  3. from mypkg.sibling import example 

如果是处理复杂的包结构,绝对导入可能会显得比较冗余,这个时候可以使用相对导入。在Python 2中,相对导入又可以分为显式相对导入和隐式相对导入,而在Python 3中,已经弃用了隐式相对导入。因此,如果要使用相对导入的话,一定要使用显式相对导入。例如,在下面的例子中,包前面的点号就表示当前目录。通过这种方式,我们就实现了显式的相对导入。

  1. from . import sibling  
  2. from .sibling import example 

PEP 8还给出了标准库的编码规范。例如,在标准库的包导入规则中,一方面禁止使用复杂的包结构,另一方面禁止使用相对导入。这样既能够保证不使用相对包导入,也能够保持包导入代码的整洁性。我们自己编写Python代码时也应该尽力向标准库靠拢。

从一个模块中导入类,可以使用from xx import xx语句导入,通过这种方式导入,使用起来会比较方便:

  1. from myclass import MyClass  
  2. from foo.bar.yourclass import YourClass 

如果上面这种导入方式导致命名冲突,可以导入整个模块:

  1. import myclass  
  2. import foo.bar.yourclass 

无论何时,都应该避免使用通配符导入( from xx import *)。通配符导入会使名称空间里存在的名称变得不清晰,迷惑读者和自动化工具。

PEP 8的编码风格指导比较长,并且写得非常详细。因此,这里就没有必要再重复一遍,读者可以参考Python官网资料。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Cisco网络工程案例精粹

《Cisco网络工程案例精粹》是一本以案例为基础兼顾知识概述的案例性书籍,所收录的案例都是笔者精心挑选出来的在网络工作中常见的案例。 ...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊