Python 常用 PEP8 编码规范详解

Python 常用 PEP8 编码规范

代码布局

缩进

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

EXAMPLE:

# (垂直隐式缩进)对准左括号
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',
)

错误示范:

# 不使用垂直对齐时,第一行不能有参数。
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:

# 无括号续行, 利用反斜杠
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:

# 类的方法定义用单个空行分割,两行空行分割顶层函数和类的定义。
class A(object):
 def method1():
 pass

 def method2():
 pass

def method3():
 pass

模块导入

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

EXAMPLE:

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

错误示例:

# 一行导入多模块
import sys, os, knife

# 不按首字母导入
import create
import active
import beyond

字符串

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

EXAMPLE:

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

表达式和语句中的空格

括号里边避免空格

EXAMPLE:

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

错误示例:

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

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

EXAMPLE:

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

错误示例:

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

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

EXAMPLE:

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

错误示例:

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

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

EXAMPLE:

x = 1
y = 2
long_variable = 3

错误示例:

x  = 1
y  = 2
long_variable = 3

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

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

EXAMPLE:

a = b
a or b

# 括号内的操作符不需要空格
name = get_name(age, sex=None, city=Beijing)

注释

注释块

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

EXAMPLE:

# 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:

x = x + 1 # Compensate for border

文档字符串

EXAMPLE:

# 多行文档, 首行首字母大写,结尾的 """ 应该单独成行
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""

# 单行的文档, 结尾的 """ 在同一行。
"""Return a foobang"""

命名规则

包和模块名:

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

类名:

遵循驼峰命名

class MyClass(object):
 pass

全局变量名:

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

EXAMPLE:

_name = 'name'

函数名

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

EXAMPLE:

vcenter_connection = ''

常量名

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

EXAMPLE:

MAX_OVERFLOW = ''
TOTAL = 1

方法名和实例变量

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

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

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

编程建议

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

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

EXAMPLE:

# Yes
if foo is not None

# No
if not foo is None

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

# 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:

# 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:

# 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

# Yes
def foo():
 return None

# No
def foo():
 return

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

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

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

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

EXAMPLE:

# Yes
if foo.startswith('bar'):

# No
if foo[:3] == 'bar':

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

EXAMPLE:

# Yes
if isinstance(obj, int):

# No
if type(obj) is type(1):

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

# Yes
if not seq:
 pass
if seq:
 pass

# No
if len(seq):
 pass
if not len(seq):
 pass

不要用 == 进行 bool 比较

# Yes
if greeting:
 pass

# No
if greeting == True
 pass
if greeting is True: # Worse
 pass

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 浅谈python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个坑是如此之大,犹豫再三,还是只捡一下重要的内容来讲吧,不足的内容只能靠大家自己去补充了. 惯例声明一下,我使用的版本是 python2.7,版本之间可能存在差异. 好,在开讲之前,我们先思考一个问题,看代码: 为什么我只创建是为 a 赋值,就可以使用一些我没写过的方法? 可能会有小伙伴说:因为 a

  • Python 数据结构之队列的实现

    Python 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queue: queue = [] # 初始化一个列表数据类型对象, 作为一个队列 def enQ(): # 定义一个入栈方法 queue.append(raw_input('Enter New String: ').strip()) # 提示输入一个入队的 String 对象, 调用 Str.strip()

  • Python基本语法经典教程

    本文讲述了Python基本语法.分享给大家供大家参考,具体如下: 概述: 这里主要讲述以下内容: ① 缩进 ② 流程控制语句 ③ 表达式 ④ 函数 ⑤ 对象的方法 ⑥ 类型 ⑦ 数学运算 1. 缩进 Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯.并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字.增加缩进表示语句块的开始,而减少缩进则表示语句块的退出.缩进成为了语法的一部分.例如if语句: if

  • Python程序设计入门(1)基本语法简介

    Python是当今日趋流行的一种脚本语言,它比Java更简单,比php更强大,并且还适用于做桌面应用的开发,在ubuntu中,更加是必须的一种脚本引擎,所以有必要去学习一下,这里的文章只针对有一定编程基础,最好是比较熟悉php或javascript的用户,如果没任何基础的新手建议找更详细的教程去学习. Python的变量是不需要定义的,这方面和php一样,它比javascript还是宽松,不过它是用缩进作为段落标识的,作为习惯了C语言风格语法的人,可能一开始会很不习惯使用,但细一想,其实也是很正

  • Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令函数与函数之间,函数与主程序之间更加紧密的联系起来. 函数的返回值 在Python的函数中都有一个返回值,默认为None.也可以使用return value语句来定义一个且只能定义一个可为任意类型的返回值.但是我们能够返回一个序列类型的对象,来实现返回多个值的效果. Example: 返回一个Lis

  • Python 数据结构之堆栈实例代码

    Python 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是把一个对象入栈. pop: 意思是把一个对象出栈. 下面是一个由 Python 实现的简单的堆栈结构: stack = [] # 初始化一个列表数据类型对象, 作为一个栈 def pushit(): # 定义一个入栈方法 stack.append(raw_input('Enter New String:

  • Python基础教程之正则表达式基本语法以及re模块

    什么是正则: 正则表达式是可以匹配文本片段的模式. 正则表达式'Python'可以匹配'python' 正则是个很牛逼的东西,python中当然也不会缺少. 所以今天的Python就跟大家一起讨论一下python中的re模块. re模块包含对正则表达式的支持. 通配符 .表示匹配任何字符: '.ython'可以匹配'python'和'fython' 对特殊字符进行转义: 'python\.org'匹配'python.org' 字符集 '[pj]ython'能够匹配'python'和'jython

  • Python 常用 PEP8 编码规范详解

    Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: # (垂直隐式缩进)对准左括号 foo = long_function_name(var_one, var_two, var_three, var_four) # (悬挂缩进) 一般情况只需多一层缩进 foo = long_function_name( var_one, var_two, var_three, var_four) # (悬挂缩进) 但下面情况,

  • Python常用图像形态学操作详解

    目录 腐蚀 膨胀 开运算与闭运算 开运算 闭运算 梯度运算 礼帽与黑帽 礼帽 黑帽 腐蚀 在一些图像中,会有一些异常的部分,比如这样的毛刺: 对于这样的情况,我们就可以应用复式操作了.需要注意的是,腐蚀操作只能处理二值图像,即像素矩阵的值只有0(黑色)和255(白色).我们先看看代码和效果: import cv2 import numpy as np img = cv2.imread('dagongren.png') # 腐蚀的代码 kernel = np.ones((3,3),np.uint8

  • Python常用正则函数使用方法详解

    今天给大家介绍一下Python中常用的正则表达式处理函数.Python的正则表达式主要有两种方法完成模式匹配:『搜索』和『匹配』   re.match re.match 尝试从字符串的开始全部或者部分匹配某个模式,如:下面的例子匹配第一个单词.  import re text = "PythonTab.com is a good Python website" m = re.match(r"(\w+)\s", text) if m: print m.group(0)

  • Python有关Unicode UTF-8 GBK编码问题详解

    目录 1.统一码(Unicode) 2.UTF-8编码 总结 1.统一码(Unicode) Unicode也叫万国码.单一码,是计算机科学领域里的一项业界标准,包括字符集.编码方案等.对于世界上所有的语言文字再unicode中都可以查看到.[汉]字的编码解释官网https://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=6C49 unicode编码就是为了统一世界上的编码,有一个统一的规范.但是它还存在一些问题. Unicode的问题 需

  • python源文件的字符编码知识点详解

    默认情况下,Python 源码文件以 UTF-8 编码方式处理.在这种编码方式中,世界上大多数语言的字符都可以同时用于字符串字面值.变量或函数名称以及注释中--尽管标准库中只用常规的 ASCII 字符作为变量或函数名,而且任何可移植的代码都应该遵守此约定.要正确显示这些字符,你的编辑器必须能识别 UTF-8 编码,而且必须使用能支持打开的文件中所有字符的字体. 1.如果不使用默认编码,要声明文件所使用的编码,文件的第一行要写成特殊的注释. 语法如下所示: # -*- coding: encodi

  • 关于Python OS模块常用文件/目录函数详解

    模块:包含定义函数和变量的python文件,可以被别的程序引入. os模块是操作系统接口模块,提供了一些方便使用操作系统相关功能函数,这里介绍下os模块中对于文件/目录常用函数和使用方法. 1. 返回当前文件目录:getcwd() 2.改变工作目录:chdir(path) 将当前工作目录更改为path的目录 3. 更改当前进程根目录:chroot(path) 4.列举出目录中的文件名:listdir(path) 返回列表,包含了path所有文件和目录名称,排序无顺序 5.创建目录:mkdir(p

  • Web网络安全漏洞分析XSS常用语句及编码绕过详解

    目录 XSS进阶 XSS常用语句及编码绕过 XSS常用的测试语句 JS编码 HTML实体编码 URL编码 XSS进阶 XSS常用语句及编码绕过 XSS常用的测试语句 <img src=1 alert(1)> (显示1) <script>alert("xss")</script> (显示xss) <script>alert(document.cookie)</script> (显示cookie) <script>wi

  • Python中字典常用操作的示例详解

    目录 前言 初始化 合并字典 字典推导式 Collections 标准库 字典转 JSON 字典转 Pandas 前言 字典是Python必用且常用的数据结构,本文梳理常用的字典操作,看这个就够了,涉及: 初始化 合并字典 字典推导式 Collections 标准库 字典转JSON 字典转Pandas 初始化 # 最常用这种 my_object = { "a": 5, "b": 6 } # 如果你不喜欢写大括号和双引号: my_object = dict(a=5,

  • Python中字典及遍历常用函数的使用详解

    目录 字典中元素的个数计算 字典中的键名 加粗样式字典中的键值 字典的键名以及对应的键值 字典的遍历 方法一 方法二 字典中元素的个数计算 len(字典名) 举例: person={"姓名":"张三","年龄":20,"性别":"男"} print(len(person)) 输出: 3 字典中的键名 字典名.keys() 举例: person={"姓名":"张三",&

  • Python中集合的创建及常用函数的使用详解

    目录 集合的创建 无序性 集合中的操作函数 在集合中添加元素 删除集合中的第一个元素 删除集合中的指定元素 判断元素是否在集合里面 集合的遍历 集合元素个数的计算 集合与字典,列表,元组的嵌套 集合与元组 集合与列表 集合的创建 使用内置函数set()进行转化或者使用{}包括起来的,集合中的元素:无序性,互异性,确定性. 举例: numbers=set(range(0,7))//使用内置函数进行转化 print(numbers) print(type(numbers)) 输出: {0, 1, 2

随机推荐