Python 常用 PEP8 编码规范

代码布局

缩进

  • 每级缩进用4个空格。
  • 括号中使用垂直隐式缩进或使用悬挂缩进。

EXAMPLE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# (垂直隐式缩进)对准左括号
foo = long_function_name(var_one, var_two,
    var_three, var_four)
 
# (悬挂缩进) 一般情况只需多一层缩进
foo = long_function_name(
 var_one, var_two,
 var_three, var_four)
 
# (悬挂缩进) 但下面情况, 需再加多一层缩进, 和后续的语句块区分开来
def long_function_name(
 var_one, var_two, var_three,
 var_four):
 print(var_one)
 
 
 
# 右括号回退
my_list = [
 1, 2, 3,
 4, 5, 6,
]
result = some_function_that_takes_arguments(
 'a', 'b', 'c',
 'd', 'e', 'f',
)

错误示范:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 不使用垂直对齐时,第一行不能有参数。
foo = long_function_name(var_one, var_two,
 var_three, var_four)
 
# 参数的悬挂缩进和后续代码块缩进不能区别。
def long_function_name(
 var_one, var_two, var_three,
 var_four):
 print(var_one)
 
# 右括号不回退,不推荐
my_list = [
 1, 2, 3,
 4, 5, 6,
 ]
 
result = some_function_that_takes_arguments(
 'a', 'b', 'c',
 'd', 'e', 'f',
 )

最大行宽

  1. 每行最大行宽不超过 79 个字符
  2. 一般续行可使用反斜杠
  3. 括号内续行不需要使用反斜杠

EXAMPLE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 无括号续行, 利用反斜杠
with open('/path/to/some/file/you/want/to/read') as file_1, \
 open('/path/to/some/file/being/written', 'w') as file_2:
 file_2.write(file_1.read())
 
# 括号内续行, 尽量在运算符后再续行
class Rectangle(Blob):
 
 def __init__(self, width, height,
   color='black', emphasis=None, highlight=0):
 if (width == 0 and height == 0 and
  color == 'red' and emphasis == 'strong' or
  highlight > 100):
  raise ValueError("sorry, you lose")
 if width == 0 and height == 0 and (color == 'red' or
      emphasis is None):
  raise ValueError("I don't think so -- values are %s, %s" %
    (width, height))

空行

  1. 两行空行用于分割顶层函数和类的定义
  2. 单个空行用于分割类定义中的方法

EXAMPLE:

1
2
3
4
5
6
7
8
9
10
11
# 类的方法定义用单个空行分割,两行空行分割顶层函数和类的定义。
class A(object):
 def method1():
 pass
 
 def method2():
 pass
 
 
def method3():
 pass

模块导入

  1. 导入的每个模块应该单独成行
  2. 导入顺序如下: (各模块类型导入之间要有空行分割,各组里面的模块的顺序按模块首字母自上而下升序排列)
  1. 标准库
  2. 相关的第三方库
  3. 本地库

EXAMPLE:

1
2
3
4
# 按模块首字母排序导入, 依此递推
import active
import adidas
import create

错误示例:

1
2
3
4
5
6
7
# 一行导入多模块
import sys, os, knife
 
# 不按首字母导入
import create
import active
import beyond

字符串

单引号和双引号作用是一样的,但必须保证成对存在,不能夹杂使用. (建议句子使用双引号, 单词使用单引号, 但不强制.)

EXAMPLE:

1
2
3
# 单引号和双引号效果一样
name = 'JmilkFan'
name = "Hey Guys!"

表达式和语句中的空格

括号里边避免空格

EXAMPLE:

1
spam(ham[1], {eggs: 2})

错误示例:

1
spam( ham[ 1 ], { eggs: 2 } )

逗号,冒号,分号之前避免空格

EXAMPLE:

1
if x == 4: print x, y; x, y = y, x

错误示例:

1
if x == 4 : print x , y ; x , y = y , x

函数调用的左括号之前不能有空格

EXAMPLE:

1
2
spam(1)
dct['key'] = lst[index]

错误示例:

1
2
spam (1)
dct ['key'] = lst [index]

赋值等操作符前后不能因为对齐而添加多个空格

EXAMPLE:

1
2
3
x = 1
y = 2
long_variable = 3

错误示例:

1
2
3
= 1
= 2
long_variable = 3

二元运算符两边放置一个空格

  1. 涉及 = 的复合操作符 ( += , -=等)
  2. 比较操作符 ( == , < , > , != , <> , <= , >= , in , not in , is , is not )
  3. 逻辑操作符( and , or , not )

EXAMPLE:

1
2
3
4
5
a = b
a or b
 
# 括号内的操作符不需要空格
name = get_name(age, sex=None, city=Beijing)

注释

注释块

注释块通常应用在代码前,并和代码有同样的缩进。每行以 ‘# ' 开头, 而且#后面有单个空格。

EXAMPLE:

1
2
3
4
# Have to define the param `args(List)`,
# otherwise will be capture the CLI option when execute `python manage.py server`.
# oslo_config: (args if args is not None else sys.argv[1:])
CONF(args=[], default_config_files=[CONFIG_FILE])

单行注释(应避免无谓的注释)

EXAMPLE:

1
x = x + 1 # Compensate for border

文档字符串

EXAMPLE:

1
2
3
4
5
6
7
# 多行文档, 首行首字母大写,结尾的 """ 应该单独成行
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
 
# 单行的文档, 结尾的 """ 在同一行。
"""Return a foobang"""

命名规则

包和模块名:

包和模块名应该简短,全部用小写字母, 多字母之间可以使用单下划线连接。

类名:

遵循驼峰命名

1
2
class MyClass(object):
 pass

全局变量名:

全局变量名应尽量只在模块内部使用, 对可能使用语句 from moduleName import variableName 而被导入的模块,应采用 __all__ 机制来防止全局变量被别的模块导入, 或者在全局变量名开头加一个前置下划线.

EXAMPLE:

1
_name = 'name'

函数名

函数名应该为全部小写的凹驼峰规则。

EXAMPLE:

1
vcenter_connection = ''

常量名

常量全部使用大写字母的凹驼峰规则来表示, 通常在模块顶格定义

EXAMPLE:

1
2
MAX_OVERFLOW = ''
TOTAL = 1

方法名和实例变量

非公开方法和实例变量开头使用前置下划线

有时候可能会为了避免与子类命名冲突,采用两个前置下划线

需要注意的是: 若 class Foo 的属性名为 __a, 该属性是不能以 Foo.__a 的方式访问的(执著的用户还是可以通过Foo._Foo__a 来访问), 所以通常双前置下划线仅被用来避免与基类的属性发生命名冲突。

编程建议

None 的比较用 is 或 is not,而不要用 ==

用 is not 代替 not … is, 前者的可读性更好

EXAMPLE:

1
2
3
4
5
# Yes
if foo is not None
 
# No
if not foo is None

使用函数定义关键字 def 代替 lambda 赋值给标识符, 这样更适合于回调和字符串表示

1
2
3
4
5
6
# Yes
def f(x):
 return 2*x
 
# No
f = lambda x: 2*x

异常类应该继承自Exception,而不是 BaseException

Python 2 中用raise ValueError('message') 代替 raise ValueError, 'message'

(考虑兼容python3和续行的方便性)

捕获异常时尽量指明具体异常, 尽量不用 except Exception, 应该捕获 出了什么问题,而不是 问题发生

EXAMPLE:

1
2
3
4
5
6
7
8
9
10
11
# Yes (捕获具体异常)
try:
 import platform_specific_module
except ImportError:
 platform_specific_module = None
 
# No (不要全局捕获)
try:
 import platform_specific_module
except:
 platform_specific_module = None

try/except 子句中的代码要尽可能的少, 以免屏蔽掉其他的错误

EXAMPLE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Yes
try:
 value = collection[key]
except KeyError:
 return key_not_found(key)
else:
 return handle_value(value)
 
# No
try:
 return handle_value(collection[key])
except KeyError:
 # 可能会捕捉到 handle_value()中的 KeyError, 而不是 collection 的
 return key_not_found(key)

函数或者方法在没有返回值时要明确返回 None

1
2
3
4
5
6
7
# Yes
def foo():
 return None
 
# No
def foo():
 return

使用字符串方法而不是 string 模块

python 2.0 以后字符串方法总是更快,而且与 Unicode 字符串使用了相同的 API

使用使用 .startswith() 和 .endswith() 代替字符串切片来检查前缀和后缀

startswith() 和 endswith 更简洁,利于减少错误

EXAMPLE:

1
2
3
4
5
# Yes
if foo.startswith('bar'):
 
# No
if foo[:3] == 'bar':

使用 isinstance() 代替对象类型的比较

EXAMPLE:

1
2
3
4
5
# Yes
if isinstance(obj, int):
 
# No
if type(obj) is type(1):

空序列类型对象的 bool 为 False:

1
2
3
4
5
6
7
8
9
10
11
# Yes
if not seq:
 pass
if seq:
 pass
 
# No
if len(seq):
 pass
if not len(seq):
 pass

不要用 == 进行 bool 比较

1
2
3
4
5
6
7
8
9
# Yes
if greeting:
 pass
 
# No
if greeting == True
 pass
if greeting is True: # Worse
 pass

Python 常用 PEP8 编码规范的更多相关文章

  1. Python 常用 PEP8 编码规范和建议

    代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: # (垂直隐式缩进)对准左括号 foo = long_function_name(var_one, va ...

  2. 16 pep8 编码规范

    pep8 编码规范 Python Enhancement Proposals :python改进方案 https://www.python.org/dev/peps/ 1. 每级缩进用4个空格. 括号 ...

  3. Python常用字符编码(转)

    Python常用字符编码   字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...

  4. 学习笔记之Python最简编码规范

    Python最简编码规范 - 机器学习算法与Python学习 https://mp.weixin.qq.com/s/i6MwvC4jYTE6D1KHFgBeoQ https://www.cnblogs ...

  5. 【翻译】Python PEP8编码规范(中文版)

    原文链接:http://legacy.python.org/dev/peps/pep-0008/ item detail PEP 8 Title Style Guide for Python Code ...

  6. python 编码规范起源:PEP8 编码规范中文版

    PEP: 8 标题: Python代码的样式指南 版: c451868df657 最后修改: 2016-06-08 10:43:53 -0400(2016年6月8日星期三) 作者: Guido van ...

  7. Python第一章-编码规范

    Python的基础知识 一.编码规范 PEP8[^ 注] 编码规范 Guido的关键点之一是:代码更多是用来读而不是写.编码规范旨在改善Python代码的可读性. 风格指南强调一致性.项目.模块或函数 ...

  8. python的统一编码规范

    请注意这一点:没有编码规范的代码没有阅读价值,也更谈不上复用. 目前业界比较流行的Python的编码规范目前主要有PEP8的编程.Google的编码风格.Python Guide和Pocoo Styl ...

  9. Python PEP 8 编码规范中文版

    原文链接:http://legacy.python.org/dev/peps/pep-0008/ 转发链接:https://blog.csdn.net/ratsniper/article/detail ...

随机推荐

  1. 5-es6的模块化开发与其它的不同

    1.加载机制不同es是静态加载,其它是动态加载.Es6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量.CommonJS 和 AMD.CMD 模块,都只能在运行 ...

  2. hu3613 Best Reward

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目: Best Reward Time Limit: 2000/1000 MS (Java/Oth ...

  3. 【android】activity的4种启动模式简介

    首先咱必须知道,activity是以栈(后进先出)的结构进行管理的. 当活动A启动了活动B时,A被压入到栈内,B在栈的最顶层.当B调用finish()结束活动时,B从栈弹出,此时A在栈的最顶层. 我们 ...

  4. TOSCA自动化测试工具视频资料

    https://www.udemy.com/ search 'TOCSA' 找到两个免费资料学习

  5. 浅谈HTTP请求与响应

    HTTP协议用于客户端和服务器之间的通信,请求访问的一段是客户端,提供资源响应的一段是服务器端. HTTP通信是采用请求应答的方式来进行的,客户端发出请求,服务器响应.如果没有客户端的请求,服务器端是 ...

  6. iOS 自动订阅开发

    一.代码逻辑 关于iOS 订阅.自动订阅 本身功能开发很简单.跟正常的购买没什么大的差异.唯一需要特殊处理(自动订阅)的是, 在APP启动时候要增加侦听: [[SKPaymentQueue defau ...

  7. javascript 基本数据类型、引用数据类型

    阅读目录 数据类型 两种访问方式 两种类型复制 函数参数的传递 两种变量类型检测 回到目录   数据类型 1.   ECMAScript变量包含两种不同类型的值:基本类型值.引用类型值: 2.   基 ...

  8. WebService发布协议--SOAP和REST的区别

    HTTP是标准超文本传输协议.使用对参数进行编码并将参数作为键值对传递,还使用关联的请求语义.每个协议都包含一系列HTTP请求标头及其他一些信息,定义客户端向服务器请求哪些内容,服务器用一系列HTTP ...

  9. 使用sql语句创建 表空间 和用户,以及如何彻底删除表空间和用户,使用命令导出和导出数据库

    创建表空间有很多种方式,在安装好oracle 11g 后在网站上 https://localhost:1158/em 手动创建也可以,但是没有sql直接生成方便,下面介绍下如何用sql语句直接生成表空 ...

  10. 关于Linq的对List<实体>去掉重复ID的一个小例子!

    注意 下面的代码只要ID相同(即使其他的不相同)都会过滤掉,简单来讲就是过滤掉ID相同的实体,如果ID相同,其他属性取第一个的值 List<Abc> list = new List< ...