Python-Python编码规范(PEP8)

  • Post author:
  • Post category:python



目录


简介


文件编码


代码布局


导入库函数


缩进


行长度


空行


字符串


表达式和语句中的空白


避免空格


其他


注释


块注释


行注释


文档字符串


函数注释


命名规范


采用描述性的命名规则


类的命名采用驼峰命名法


避免使用的名称


软件包/模块名称


函数名称


函数/方法参数


常量


编程建议


字符串


布尔判断


函数


异常


简介

PEP 8 Style Guide for Python Code,即Python代码样式指南,或者说python编码规范。本文对文档进行了筛选与汉化,由于并不是完全复制到百度或谷歌进行翻译(这样也没啥意思),所以并不全,目录也根据个人理解(尽量从python文件的上方到下方)有所改变,英文好的可以直接看官网。红色的是个人认为应该遵守的,其余的看习惯吧。


文件编码

核心Python发行版中的代码应该始终使用UTF-8(Python 2中使用ASCII)。

代码布局


导入库函数

导入始终放在文件顶部,紧随任何模块之后 注释和文档字符串,以及模块全局变量和常量之前。

导入应按以下顺序进行:

  1. 标准库导入
  2. 有关的第三方库进口
  3. 本地应用程序/库特定的导入

若是导入多个库函数,应该分开依次导入:

import os
import sys

应避免使用通配符导入(from xxx import *)


缩进

每个缩进级别4个空格,建议使用IDE自带的,比如Pycharm。

建议不使用制表符(Tab),不要混用制表符和空格!!!


行长度

每行最大长度

79字符

,换行可以使用反斜杠,最好使用圆括号,IDE中一般Enter会自动添加。


文档字符串或注释

,行长应限制为

72 字符

一般过长,IDE会提示。

有二元操作符时应在操作符前换行

# Correct:
# easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
# Wrong:
# operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

空行



两个空白行

分隔

顶层函数和类定义





一个空行

分隔

类中的方法

定义。

可以使用额外的空白行(节省空间)来分隔相关功能组。在一堆相关的单行程序(例如,一组虚拟执行程序)之间可能会省略空白行。

在函数中使用空行来节省逻辑部分。

恰当的使用空白行可以提高代码的可读性。

字符串

在Python中,单引号字符串和双引号字符串是相同的。PEP没有对此做建议。

个人建议使用双引号来包含长度大于1的字符串,使用单引号来包含长度为1的字符串

,与其他语言一致(博主用Python一段时间,等用C++时有时就对字符串使用单引号,然后出错)。如果字符串中存在单引号或双引号,字符串可使用另一个来包含,尽量避免转义(反斜杠)。

表达式和语句中的空白

避免空格


在以下情况下避免无关的空格


在括号或大括号内

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

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

# Correct:
foo = (0,)
# Wrong:
bar = (0, )


在逗号,分号或冒号前面

# Correct:
if x == 4: print x, y; x, y = y, x
# Wrong:
if x == 4 : print x , y ; x , y = y , x


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

# Correct:
spam(1)
# Wrong:
spam (1)


紧接在开始括号之前,开始索引或切片

# Correct:
dct['key'] = lst[index]
# Wrong:
dct ['key'] = lst [index]


在一个赋值(或其他)运算符周围用多于一个的空格来对齐它

# Correct:
x = 1
y = 2
long_variable = 3
# Wrong:
x             = 1
y             = 2
long_variable = 3

其他


避免在任何地方尾随空格


总是围绕这些二元运算符在两侧使用一个空格

=

+=, -=,*=, /=

==, <, >, !=, <>, <=, >=, in, not in, is, is not

and, or, not

如果使用优先级不同的运算符,请考虑添加优先级最低的运算符周围的空白,有括号时可考虑括号外添加。

# Correct:
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
# Wrong:
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)


函数注释应使用冒号和空格,如果存在->,->两侧应该有空格

# Correct:
def munge(input: AnyStr): ...
def munge() -> PosInt: ...
# Wrong:
def munge(input:AnyStr): ...
def munge()->PosInt: ...

表示关键字参数或默认值时不必添加空格

# Correct:
def complex(real, imag=0.0):
    return magic(r=real, i=imag)
# Wrong:
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)

注释


代码更改时,相应的注释也要随之更改


块注释


通常由一个或多个段落组成完整的句子,每个句子以句号结尾

行注释

行注释用#和一个空格开始,一般在代码的上一行,如果代码较短,又很重要,可以与代码一行,建议与代码空两个空格

flag = true  # set flag to true, so there is no border problem


文档字符串

常用

三个双引号作文档字符串

,文档字符串常用在模块的开端用以说明模块的基本功能,或紧跟函数定义的后面用以说明函数的基本功能,参数,返回值。

函数注释

第一行说明函数的作用,接下来是函数的参数、函数的返回值。pycharm中函数后打三双引号即可自动添加。

def plus(a,b):
    """
    compute a+b and return result
    :param a: int, a number
    :param b: int, another number
    :return: int, a+b
    """

命名规范

采用描述性的命名规则

例如一个实现某种功能的类或函数,那这个类或函数的名字就以相应的功能实现作为命名,简单易懂。

类的命名采用驼峰命名法

每个单词的首字母大写。由于python官方还存在tuple、SystemExit等混用的情况,个人认为这里暂时没必要。


避免使用的名称

切勿将字符’l’(小写字母el),’O’(大写字母oh)或’I’(大写字母i)作为单个字符变量名称。在一些字体中,这些字符与数字1和零是无法区分的。当试图使用“l”时,请使用“L”。


软件包/模块名称

建议使用简短的全小写名称,不建议特别长,实在不行就使用下划线。


函数名称

应该是小写的,为了提高可读性,必须使用由下划线分隔的单词。如果函数参数的名称与保留关键字冲突,通常最好追加一个尾部下划线,而不是使用缩写或拼写损坏。


函数/方法参数

始终将 self 作为实例方法的第一个参数。

始终 使用 cls 作为类方法的第一个参数 。


常量

常量通常在模块级别定义,并全部写入带下划线的大写字母。 例子包括 MAX_OVERFLOW 和 TOTAL 。

编程建议

字符串

不建议使用+进行字符串连接,这个的优化不好。建议使用”.join()。

使用startwith/endwith判断前后缀,而不是==与切片[]

# Correct:
if foo.startswith('bar'):
# Wrong:
if foo[:3] == 'bar':

布尔判断

与单例(例如,None)比较,请使用is 或者 is not进行判断,而不是==。内部区别是使用id还是__eq__,__eq__可覆盖。

# Correct:
if foo is not None:
# Wrong:
if foo == None:

不要在条件语句中使用==比较bool值和True或False

# Correct:
if greeting:
# Wrong:
if greeting == True:

函数

没有用到self的方法放到类外作为函数。

确保每个return语句都能有返回值,不能返回的应显式的返回None。

# Correct:

def foo(x):
    if x >= 0:
        return math.sqrt(x)
    else:
        return None

def bar(x):
    if x < 0:
        return None
    return math.sqrt(x)
# Wrong:

def foo(x):
    if x >= 0:
        return math.sqrt(x)

def bar(x):
    if x < 0:
        return
    return math.sqrt(x)

异常

从Exception派生,而不是BaseException。

try语句中尽量包含更少的代码,避免掩盖错误。

# Correct:
try:
    value = collection[key]
except KeyError:
    return key_not_found(key)
else:
    return handle_value(value)
# Wrong:
try:
    # Too broad!
    return handle_value(collection[key])
except KeyError:
    # Will also catch KeyError raised by handle_value()
    return key_not_found(key)

更多python相关内容:

【python总结】python学习框架梳理

本人b站账号:

lady_killer9

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。



版权声明:本文为lady_killer9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。