Python-Python编码规范(PEP8)

目录

简介

文件编码

代码布局

导入库函数

缩进

行长度

空行

字符串

表达式和语句中的空白

避免空格

其他

注释

块注释

行注释

文档字符串

函数注释

命名规范

采用描述性的命名规则

类的命名采用驼峰命名法

避免使用的名称

软件包/模块名称

函数名称

函数/方法参数

常量

编程建议

字符串

布尔判断

函数

异常


简介

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(小于),您的支持是我不断更新的动力。

 

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值