龙空技术网

Python PEP8 编程规范都在这里,助力你成为开发老司机一

埋头苦干的小码农 184

前言:

当前朋友们对“pep8python编码规范文”大约比较着重,姐妹们都想要了解一些“pep8python编码规范文”的相关文章。那么小编在网上汇集了一些关于“pep8python编码规范文””的相关文章,希望姐妹们能喜欢,兄弟们一起来了解一下吧!

关于PEP8介绍

  本文档给出了Python代码组成的编码约定,其中包含主要Python发行版中的标准库。请参阅在Python的C实现中为C代码描述样式准则的配套信息PEP 。

  本文档和PEP 257(Docstring公约)改编自Guido最初的Python风格指南文章,并增加了一些Barry风格指南。

  随着时间的推移,这种风格指南会随着其他惯例的确定而变化,过去的惯例会因语言本​​身的变化而过时。

  许多项目都有自己的编码风格指南。在发生任何冲突时,此类项目特定的指南优先于该项目。

关于编码风格一致性的介绍

  Guido的主要见解之一是代码读取的次数比写入次数多得多。这里提供的准则旨在提高代码的可读性并使其在各种Python代码中保持一致。正如PEP 20所说,“可读性计数”。

  风格指南是关于一致性的。与此风格指南的一致性非常重要。项目中的一致性更重要。一个模块或功能内的一致性是最重要的。

  但是,知道什么时候不一致 - 有时风格指导建议不适用。如有疑问,请使用您的最佳判断。看看其他例子,并决定什么看起来最好。不要犹豫,问!

特别是:不要为了符合这个PEP而打破向后兼容!

其他一些很好的理由可以忽略特定的指导方针:

在应用指南时,即使对于习惯阅读遵循此PEP的代码的人来说,代码的可读性也会降低。为了与周围的代码保持一致(也许是出于历史原因) - 尽管这也是一个清理别人乱七八糟(真正的XP风格)的机会。因为有关代码早于引入准则,所以没有其他理由要修改该代码。当代码需要与旧版本的Python不兼容时,该版本不支持样式指南推荐的功能。代码布局

缩进

  每个缩进级别使用4个空格。

  连续行应使用Python的隐式行连接括号,括号和大括号,或使用悬挂缩进 来垂直对齐包装元素。当使用悬挂式缩进时,应考虑以下内容:第一行应该没有任何争论,应该使用进一步的缩进来将自己明确地区分为延续线。

正确做法

#与开头分隔符对齐。foo = long_function_name(var_one,var_two,                         var_three,var_four)#包含更多缩进区别于其他缩进。def long_function_name(        var_one,var_two,var_three,        var_four):    打印(var_one)#悬挂缩进应该添加一个级别。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):    打印(var_one)

四维空间规则对于延续线是可选的。

可选择

#悬挂缩进*可以缩进至4个以内。foo = long_function_name(  var_one,var_two,  var_three,var_four)

  当if语句的条件部分足够长以至于需要将其写入多行时,值得注意的是,两个字符关键字(即if)的组合,再加上一个空格以及一个左括号会创建一个自然的多行有条件的后续行使用4空格缩进。这可能会与嵌套在if语句中的缩进代码套件产生视觉冲突,该套件自然会缩进到4个空格。这个PEP没有明确地说明如何(或是否)在if语句中进一步从视觉上区分这些条件行与嵌套套件。这种情况下的可接受选项包括但不限于:

#没有额外的缩进。如果(this_is_one_thing和    that_is_another_thing):    做一点事()#添加评论,这将在编辑器中提供一些区别#支持语法高亮显示。如果(this_is_one_thing和    that_is_another_thing):    #既然这两个条件都是真的,我们可以生气。    做一点事()#在条件延续线上添加一些额外的缩进。如果(this_is_one_thing        和that_is_another_thing):    做一点事()

多行结构中的右括号/括号/括号可以排列在列表的最后一行的第一个非空白字符下

my_list = [    1,2,3,    4,5,6,    ]result = some_function_that_takes_arguments(    'a','b','c',    'd','e','f',    )

或者可能会在启动多行构建的行的第一个字符下排列

my_list = [    1,2,3,    4,5,6,]result = some_function_that_takes_arguments(    'a','b','c',    'd','e','f',)
关于标签和空格的选择问题!

  空格是首选的缩进方法。

  选项卡应完全用于与已用选项卡缩进的代码保持一致。

  Python 3不允许混合使用制表符和空格来缩进。

  Python 2代码缩进的制表符和空格混合应该转换为仅使用空格。

  当使用-t选项调用Python 2命令行解释器时,它会发出有关非法混合选项卡和空格的代码的警告。使用-tt时,这些警告会变成错误。这些选项是强烈建议!

每行字符最大长度

  将所有行限制为最多79个字符。

  对于具有较少结构限制(文档字符串或注释)的长文本块,流水线长度应限制为72个字符。

  限制所需的编辑器窗口宽度可以使多个文件并排打开,并且在使用在相邻列中显示两个版本的代码审阅工具时可以很好地工作。

  大多数工具的默认包装破坏了代码的可视化结构,使其更难以理解。选择限制是为了避免在窗口宽度设置为80的编辑器中进行包装,即使该工具在包装线条时在最终列中放置了标记符号。一些基于Web的工具可能根本不提供动态换行。

  有些团队强烈希望更长的线条长度。对于专门或主要由可以就此问题达成一致的团队维护的代码,可以将名义行长度从80个字符增加到100个字符(有效地将最大长度增加到99个字符),条件是仍然包含注释和文档字符串72个字符。

  Python标准库比较保守,需要将行限制为79个字符(文档字符串/注释为72)。

  包装长行的首选方式是在括号,括号和大括号内使用Python的隐含行连续。通过在圆括号中包装表达式,可以将多条线分成多行。这些应该优先使用反斜杠进行续行。

  有时反斜杠可能仍然适用。例如,long,multiple with -statements不能使用隐式延续,所以反斜杠是可以接受的:

open('/ path / to / some / file / you / want / to / read')作为file_1,\     open('/ path / to / some / file / being / written','w')作为file_2:    file_2.write(file_1.read())

  另一个这样的情况是assert语句。

  确保适当缩进续行。

关于在二元运算符之前还是之后断行问题

  推荐的方式是在二元运算符之后断行。但是这会以两种方式伤害可读性:操作符倾向于分散在屏幕上的不同列上,并且每个操作符都从操作数移动到前一行。在这里,眼睛必须做额外的工作来判断哪些项目被添加以及哪些被减去:

#错误:操作符远离他们的操作数income = (gross_wages +          taxable_interest +          (dividends - qualified_dividends) -          ira_deduction -          student_loan_interest)

  为了解决这个可读性问题,数学家和他们的出版商遵循相反的惯例。Donald Knuth在他的“ 计算机与排版”系列中解释了传统规则:“尽管二进制操作和关系之后段落中的公式总是中断,但显示的公式总是在二元运算符操作之前中断” 。

遵循数学的传统通常会产生更具可读性的代码:

#正确:容易使操作符与操作数匹配income = (gross_wages          + taxable_interest          + (dividends - qualified_dividends)          - ira_deduction          - student_loan_interest)

  在Python代码中,只要约定在本地一致,就可以在二元运算符之前或之后中断。建议使用新代码Knuth的风格。

空白行 

  用两个空白行围绕顶层函数和类定义。

  一个类中的方法定义被一个空行包围。

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

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

  Python接受控件-L(即^ L)换页字符作为空格; 许多工具将这些字符视为页面分隔符,因此您可以使用它们来分隔文件相关部分的页面。请注意,有些编辑器和基于Web的代码查看器可能无法将控件-L识别为换页符,并会在其位置显示另一个字形。

源文件编码

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

  使用ASCII(在Python 2中)或UTF-8(在Python 3中)的文件不应该有编码声明。

  在标准库中,非默认编码应仅用于测试目的,或者当评论或文档字符串需要提及包含非ASCII字符的作者姓名; 否则,使用\ x, \ u,\ U或\ N转义符是将非ASCII数据包含在字符串文本中的首选方法。

  对于Python 3.0及更高版本:Python标准库中的所有标识符必须使用纯ASCII标识符,并且应尽可能使用英文单词(在许多情况下,缩写和技术使用的术语不是英语)。另外,字符串文字和注释也必须使用ASCII。唯一的例外是(a)测试非ASCII功能的测试用例,以及(b)作者的名称。名称不是基于拉丁字母(拉丁语-1,ISO / IEC 8859-1字符集)的作者必须提供这个字符集中他们的名字的音译。

关于导入模块

导入模块通常应该分开,例如:

# 正确的写法import sysimport re
# 不建议写法import sys,  re
导入始终放在文件的顶部,紧跟在任何模块注释和文档字符串之后,以及模块全局变量和常量之前。模块导入应按以下顺序进行分组:标准库导入相关的第三方模块本地应用程序/库特定的导入  

应该在每组导入之间留出空行。

建议使用绝对导入,因为如果导入系统配置不正确(例如,当某个包中的目录在sys.path中结束时),它们通常更具可读性并且往往表现得更好(或者至少提供更好的错误消息):

import mypkg.siblingfrom mypkg import siblingfrom mypkg.sibling import example

明确的相对进口是绝对进口的可接受的替代方案,特别是在处理复杂的包装布局时,使用绝对进口的情况会不必要地冗长

from . import siblingfrom .sibling import example

标准库代码应避免复杂的包布局,并始终使用绝对导入。

隐进口相对应永远不会被使用,并在Python 3已被删除。

从包含类的模块中导入一个类时,通常可以这样描述:

from myclass import MyClassfrom foo.bar.yourclass import YourClass

如果此拼写导致本地名称冲突,则拼写它们

import myclassimport foo.bar.yourclass

应避免使用通配符导入(来自<module> import *),因为它们使名称空间中存在哪些名称不清楚,导致读者和许多自动化工具混淆。对于通配符导入有一个有效的用例,即重新发布内部接口作为公共API的一部分(例如,用可选加速器模块的定义覆盖接口的纯Python实现,并确切定义哪些定义预先覆盖不知道)。

以这种方式重新发布名称时,以下有关公共和内部接口的准则仍适用。

模块级别与双下方法

  模块级“dunders”(即名称具有两个前缘和两个纵下划线)如__all__,__author__,__version__等应被放置在模块文档字符串之后,但在任何导入语句以外 从__future__进口。Python要求未来 - 导入必须出现在除docstrings以外的任何其他代码之前的模块中。

“”“这是示例模块。这个模块做的东西。“””from __future__ import barry_as_FLUFL__all__ = ['a','b','c']__version__ ='0.1'__author__ ='Cardinal Biggles'import osimport sys
字符串问题

  在Python中,单引号字符串和双引号字符串是相同的。这个PEP不会为此提出建议。选择一个规则并坚持下去。但是,如果字符串包含单引号或双引号字符,请使用另一个避免字符串中的反斜杠。它提高了可读性。

  对于三引号字符串,总是使用双引号字符与PEP 257中的docstring约定一致。

表达式和语句中的空格

Pet Peeves

在以下情况下避免无关的空白:

立即在括号,括号或大括号内。

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

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

Yes: foo = (0,)No:  bar = (0, )

在逗号,分号或冒号前面

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

然而,在一个切片中,冒号的作用就像一个二元运算符,并且两边应该有相同的数量(将其视为最低优先级的运算符)。在扩展切片中,两个冒号必须具有相同量的间距。例外:当省略切片参数时,空格被省略。

YES

ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]ham[lower:upper], ham[lower:upper:], ham[lower::step]ham[lower+offset : upper+offset]ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]ham[lower + offset : upper + offset]

NO

ham[lower + offset:upper + offset]ham[1: 9], ham[1 :9], ham[1:9 :3]ham[lower : : upper]ham[ : upper]

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

Yes: spam(1)No:  spam (1)

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

Yes: dct['key'] = lst[index]No:  dct ['key'] = lst [index]

在一个赋值(或其他)运算符周围的多个空间将其与另一个对齐

正确:x = 1y = 2long_variable = 3错误:x = 1y = 2long_variable = 3
其他建议避免在任何地方拖曳空白。因为它通常是不可见的,所以可能会引起混淆:例如,反斜杠后跟一个空格,换行符不会被视为行延续标记。有些编辑不保留它,许多项目(如CPython本身)都预先提交了拒绝它的钩子。始终围绕这些二元运算符在任一侧使用一个空格:赋值(=),扩充赋值(+ =,- = 等),比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not),布尔值(和, 或,不)。

如果使用具有不同优先级的运营商,请考虑在优先级最低的运营商周围添加空白。用你自己的判断力; 但是,从不使用多个空格,并且在二元运算符的两侧始终具有相同数量的空白。

Yes:i = i + 1submitted += 1x = x*2 - 1hypot2 = x*x + y*yc = (a+b) * (a-b)No:i=i+1submitted +=1x = x * 2 - 1hypot2 = x * x + y * yc = (a + b) * (a - b)

用于指示关键字参数或默认参数值时,不要在=符号周围使用空格。

Yes:def complex(real, imag=0.0):    return magic(r=real, i=imag)No:def complex(real, imag = 0.0):    return magic(r = real, i = imag)

功能注释应该使用冒号的正常规则,并且如果存在的话,在- >箭头周围总是有空格。(有关功能注释的更多信息,请参见 下面的函数注释。)

Yes:def munge(input: AnyStr): ...def munge() -> AnyStr: ...No:def munge(input:AnyStr): ...def munge()->PosInt: ...

将参数注释与默认值组合时,请在=符号周围使用空格(但仅适用于那些同时具有注释和默认值的参数)。

正确:def munge(sep:AnyStr = None):...def munge(输入:AnyStr,sep:AnyStr = None,限制= 1000):...错误:def munge(输入:AnyStr =无):...def munge(输入:AnyStr,限制= 1000):...

通常不鼓励复合语句(同一行上的多个语句)。

Yes:if foo == 'blah':    do_blah_thing()do_one()do_two()do_three()Rather not:if foo == 'blah': do_blah_thing()do_one(); do_two(); do_three()

虽然有时可以在同一行上放置一个if / for / while与小型主体,但从不为多语句语句执行此操作。还要避免折叠这么长的线条!

Rather not:if foo == 'blah': do_blah_thing()for x in lst: total += xwhile t < 10: t = delay()Definitely not:if foo == 'blah': do_blah_thing()else: do_non_blah_thing()try: something()finally: cleanup()do_one(); do_two(); do_three(long, argument,                             list, like, this)if foo == 'blah': one(); two(); three()

何时使用尾随逗号

  尾随逗号通常是可选的,除了在制作一个元素的元组时是必须的(在Python 2中它们具有打印语句的语义)。为了清楚起见,建议用(技术上冗余的)括号括住后者。

建议:FILES =('setup.cfg',)不建议:FILES ='setup.cfg',

  当尾随逗号是多余的时候,当使用版本控制系统时,当值,参数或导入的项目列表预计会随时间扩展时,它们通常会很有帮助。模式是将每个值(等)单独放在一行上,始终添加尾随逗号,并在下一行添加右括号/括号/大括号。然而,在结束分隔符的同一行上有一个尾随逗号是没有意义的(除了上述单例元组的情况外)。

Yes:FILES = [    'setup.cfg',    'tox.ini',    ]initialize(FILES,           error=True,           )No:FILES = ['setup.cfg', 'tox.ini',]initialize(FILES, error=True,)

#python##编程##规范##计算机##科技#

标签: #pep8python编码规范文