PEP8--Python代码样式指南(中⽂版)
PEP8 – Python代码样式指南(中⽂版)
1. Introduction
本⽂档给出了包含主要Python发⾏版中的标准库的Python代码的编码约定。请参阅Python[1]的C实现中C代码的伴随信息PEP描述样式指南。
本⽂和PEP 257 (Docstring约定)是从Guido的原始Python风格指南⽂章改编⽽来的,还有⼀些来⾃Barry的风格指南[2]。
随着时间的推移,随着更多的约定被识别,过去的约定被语⾔本⾝的变化所淘汰,这种风格指南也在不断发展。
2. Code Lay-out
2.1 Indentation
每个缩进需要使⽤4个空格。
延续⾏应该使⽤Python的隐式⾏在括号、括号和⼤括号内进⾏垂直对齐,或者使⽤悬挂缩进[7]。使⽤悬挂缩进时,应考虑以下因素:第⼀⾏不应该有任何参数,进⼀步的缩进应该被⽤来清楚地区分⾃⼰作为⼀个延续⾏。
Yes:
# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
var_three, var_four)
# More indentation included to distinguish this from the rest.
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# Hanging indents should add a level.
foo = long_function_name(
var_one, var_two,
var_three, var_four)
No:
# Arguments on first line forbidden when not using vertical alignment.
foo = long_function_name(var_one, var_two,
var_three, var_four)
# Further indentation required as indentation is not distinguishable.
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
对于延续⾏,4个空格的规则是可选使⽤的。
Optional:
# Hanging indents *may* be indented to other than 4 spaces.
foo = long_function_name(
var_one, var_two,
var_three, var_four
当条件⼀个 if 语句的⼀部分⾜够长要求编写跨多个⾏,值得注意的是,两个字符的组合关键字(即如果),加上⼀个空格,加上开括号创建⼀个⾃然4空间缩进的后续⾏多⾏条件。这可能会与嵌套在 if-语句 中的缩进代码集产⽣视觉冲突,后者也会⾃然缩进到 4 个空格中。对于如何(或是否)进⼀步在视觉上区分这些条件⾏和 ne 没有明确的⽴场。
# No extra indentation.
if(this_is_one_thing and
that_is_another_thing):
do_something()
# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if(this_is_one_thing and
that_is_another_thing):
# Since both conditions are true, we can frobnicate.
do_something()
# Add some extra indentation on the conditional continuation line.
if(this_is_one_thing
and that_is_another_thing):
do_something()
(也请参阅下⾯关于在⼆进制运算符之前或之后中断的讨论。)
多⾏结构上的右括号/括号/括号可以排列在列表最后⼀⾏的第⼀个⾮空格字符下,如:
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',
)
2.2 Tabs or Spaces?
setinterval function空格是⾸选的缩进⽅法。
Tabs应该仅⽤于与已经⽤tabs缩进的代码保持⼀致。
Python 3不允许混合使⽤制表符和空格来缩进。
python 2使⽤tabs和空格的组合缩进⽅式应该转换为专门使⽤空格缩进。
2.3 Maximum Line Length
将所有⾏限制为最多79个字符。
对于具有较少结构限制的长⽂本块(⽂档字符串或注释),⾏长度应该限制为72个字符。
限制所需的编辑器窗⼝宽度可以让多个⽂件并排打开,并且在使⽤在相邻列中显⽰两个版本的代码审查⼯具时⼯作得很好。
⼤多数⼯具中的默认包装破坏了代码的视觉结构,使其更难理解。选择这些限制是为了避免在窗⼝宽度设置为80的编辑器中换⾏,即使⼯具在换⾏时在最后⼀列中放置了标记符号。⼀些基于web的⼯具
可能根本不提供动态换⾏。
有些队强烈喜欢较长的线路长度。对于专门或主要由⼀个团队维护的、能够就这个问题达成⼀致的代码,可以将标称⾏长度从80个字符增加到100个字符(有效地将最⼤长度增加到99个字符),只要注释和⽂档字符串仍然包装在72个字符。
Python标准库是保守的,要求限制⾏为79个字符(⽂档字符串/注释为72个)。
最好的换⾏⽅式是在括号、括号和⼤括号中使⽤Python的隐含的⾏延续。通过在括号中包装表达式,可以在多⾏中打断长⾏。与使⽤反斜杠进⾏⾏延续相⽐,应该优先使⽤它们。
反斜杠有时仍然是合适的。例如,长⽽多的with-statement不能使⽤隐式延续,因此可以接受反斜杠
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(ad())
(请参阅前⾯关于多⾏if-statements的讨论,以进⼀步了解此类多⾏if-statements的缩进。)
另⼀种情况是断⾔语句。
确保适当缩进连续⾏。
2.4 Should a Line Break Before or After a Binary Operator?
免费织梦模板分享⼏⼗年来,推荐的样式是在⼆进制运算符之后换⾏。但这可能在两⽅⾯破坏代码的可读性:操作符往往分散在屏幕上的不同列上,每个操作符都在其操作数的上⼀⾏。因此,眼睛必须分辨哪些操作数被加,哪些被减:
# No: operators sit far away from their operandspython基础代码100例
income =(gross_wages +
taxable_interest +
(dividends - qualified_dividends)-
ira_deduction -
student_loan_interest)
为了解决这个可读性问题,数学家和他们的出版商遵循了相反的惯例。Donald Knuth解释了他的计算机和排版系列中的传统规则:“虽然⼀个段落中的公式总是在⼆进制操作和关系之后换⾏,但是显⽰的公式总是在⼆进制操作之前进⾏换⾏”[3]
遵循数学的传统,通常会产⽣更易读的代码:
js进度条弧线>webservice接口程序# Yes: easy to match operators with operands
income =(gross_wages
+ taxable_interest
+(dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
在Python代码中,允许在⼆进制操作符之前或之后换⾏,只要约定在本地是⼀致的。
2.5 Blank Lines
⽤两个空⾏包围顶级函数和类定义。
类中定义的⽅法(函数)通过⼀个空⾏隔开。
可以(少量地)使⽤额外的空⾏来隔开相关函数组。在⼀组相关的⼀⾏程序(例如⼀组虚拟实现)之间可以省略空⾏。
在函数中尽量使⽤空⾏来指明逻辑部分。
Python接受control-L(例如^ L)换页空⽩字符;许多⼯具将这些字符视为页⾯分隔符,因此您可以使⽤它们来分隔⽂件中相关部分的页⾯。注意,⼀些编辑器和基于web的代码查看器可能不会将control-L识别为表单提要,⽽会在其位置显⽰另⼀个符号。
2.6 Source File Encoding字符串转化为长整型
核⼼Python发⾏版中的代码应该始终使⽤UTF-8(或Python 2中的ASCII)格式。
使⽤ASCII(在Python 2中)或UTF-8(在Python 3中)的⽂件不应该有编码声明。
在标准库中,⾮默认编码只能⽤于测试⽬的,或者当注释或⽂档字符串需要提到包含⾮ascii字符的作者名时。否则,使⽤\x、\u、\u或\N转义是在字符串⽂本中包含⾮ascii数据的⾸选⽅法。
对于Python 3.0及以上版本,标准库规定了以下策略(请参阅PEP 3131): Python标准库中的所有标识符必须仅使⽤ascii标识符,并且应该在可⾏的情况下使⽤英语单词(在许多情况下,使⽤的是⾮英语的缩写词和技术术语)。此外,字符串⽂字和注释也必须是ASCII格式的。唯⼀的例外是:(a) 测试⽤例测试⾮ascii特性,(b) 作者的名字。不以拉丁字母(Latin alphabet -1, ISO/IEC 8859-1字符集)为基础的作者必须在这个字符集中提供他们名字的⾳译。
⿎励具有全球受众的开源项⽬采⽤类似的策略。
2.7 Imports
导⼊操作通常按⾏分开,例:
Yes:import os
import sys
No:import sys, os
不过也可以这样操作:
from subprocess import Popen, PIPE
import 操作总是放在⽂件的顶部,在任何模块注释⽂档之后,在模块全局和常量之前进⾏。
import 操作应按以下顺序进⾏:
import 标准库
import 相关第三⽅库
import 本地⾃建库
且不同类型的库以空⾏分割。
建议绝对导⼊,因为它们通常更易于阅读,并且在导⼊路径错误时,表现的更友好(⾄少能给出更友好的错误消息):
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
但是,相对于绝对导⼊,显式的相对导⼊也是⼀种可接受的替代⽅法,特别是在处理复杂的包布局时,使⽤绝对导⼊会不不可避免的冗长,例如:
from.import sibling
from.sibling import example
⼀个标准的库代码应该避免复杂的包布局,并始终使⽤绝对导⼊。
在python3中,隐式的相对导⼊操作不能被使⽤并且已被删除。
从类包模块中import ⼀个类时,通常可以这样操作:
from myclass import MyClass
from urclass import YourClass
:如果这个 import ⽅法与本地名有冲突,那么就⽤下⾯显⽰的 import ⽅法:
import myclass
import urclass
并使⽤ "myclass.MyClass" 和 "urclass.YourClass" 操作需要的类。
应该避免通配符导⼊操作(from <module> import *),因为它们容易混淆哪些变量名是导⼊的,哪些是命名空间中出现的。
有⼀个站得住脚的通配符导⼊⽤例,这是重新发布的公共API的⼀个内部接⼝(例如,使⽤可选的accelerator模块中的定义重写接⼝的
纯Python实现,以及哪些定义将被重写,这些都是事先不知道的)。当以这种⽅式重新发布名称时,关于公共和内部接⼝的准则仍然适⽤。
2.8 Module level dunder names
模块级"dunders"(即名称前后各有两个下划线),如__all__、__author__、__version__等,应在模块注释之后且任何导模块语句之前写⼊,除了 from __future__ 。
Python要求__future__ 的 import 操作必须优先于除了模块注释之外的其他任何操作。例如:
"""This is the example module.
This module does stuff.
"""
from __future__ import barry_as_FLUFL
__all__ =['a','b','c']
__version__ ='0.1'
__author__ ='Cardinal Biggles'
import os
import sys
3. String Quotes
在Python中,单引号字符串和双引号字符串是相同的。PEP8不会对此提出建议。选择⼀个规则并坚持它。然⽽,当字符串⾥包含单引号或双引号字符时,使⽤另⼀个字符来避免字符串中的反斜杠。它提⾼了可读性(不太理解)。
对于三引号字符串,始终使⽤双引号字符以符合PEP 257中的docstring约定。
4. Whitespace in Expressions and Statements
4.1 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, x
No:if x ==4:print x , y ; x , y = y , x
然⽽,在⼀个切⽚中,冒号就像⼀个⼆进制操作符,并且两边的数量应该相等(把它当作优先级最低的操作符对待)。在扩展切⽚中,两个冒号必须具有相同的间距。例外:当切⽚参数被省略时,空格空间被省略。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论