代码布局
缩进
每个缩进级别使用4个空格。
延续线应使用Python的隐含线连接在括号,括号和大括号内,或使用悬挂缩进[7],垂直对齐包装元素。使用悬挂式凹痕时,应考虑以下因素;第一行应该没有参数,应该使用进一步的缩进来明确区分自己作为延续线。
对:
#与开口分隔符对齐。
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空间规则是可选的。
可选的:
#悬挂缩进*可以*缩进到4个空格以外的其他位置。
foo = long_function_name(
var_one,var_two,
var_three,var_four)
当if语句的条件部分长到足以要求它跨多行写入时,值得注意的是两个字符关键字(即if)的组合,加上一个空格,加上一个左括号创建一个自然的多行条件的后续行的4空格缩进。这可能会与嵌套在if语句中的缩进代码集产生视觉冲突,该代码集自然也会缩进到4个空格。这个PEP没有明确地说明如何(或是否)在if语句中进一步在视觉上区分这些条件行和嵌套套件。在这种情况下可接受的选择包括但不限于:
#没有额外的缩进。
if(this_is_one_thing和
that_is_another_thing):
做一点事()
#添加注释,这将在编辑器中提供一些区别
#支持语法高亮显示。
if(this_is_one_thing和
that_is_another_thing):
#由于这两个条件都属实,我们可以讨厌。
做一点事()
#在条件连续行上添加一些额外的缩进。
if(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,多个with语句不能使用隐式延续,因此可以接受反斜杠:
with open('/ path / to / some / file / you / want / to / read')as file_1,\
open('/ path / to / some / file / being / written','w')作为file_2:
file_2.write(file_1.read())
(有关这种多行语句缩进的进一步想法,请参见前面关于多行if语句的讨论。)
另一个这样的情况是使用断言语句。
确保适当地缩进续行。
应该在二元运算符之前或之后换行吗?
几十年来,推荐的风格是在二元运算符之后打破。但这会以两种方式损害可读性:操作员倾向于分散在屏幕上的不同列上,并且每个操作符都会从其操作数移到前一行。在这里,眼睛必须做额外的工作来分辨哪些项目被添加以及哪些项目被减去:
#No:操作符远离他们的操作数
income=(gross_wages +
taxable_interest +
(股息 - qualified_dividends) -
ira_deduction -
student_loan_interest)
为了解决这个可读性问题,数学家和他们的出版商遵循相反的惯例。 Donald Knuth在他的计算机和排版系列中解释了传统规则:“虽然段落中的公式总是在二元操作和关系之后中断,但显示的公式总是在二元操作之前中断”[3]。
遵循数学传统通常会产生更易读的代码:
#Yis:易于将操作符与操作数匹配
income=(gross_wages
+ taxable_interest
+(股息 - qualified_dividends)
- ira_deduction
- student_loan_interest)
在Python代码中,只要约定在本地一致,就允许在二元运算符之前或之后中断。对于新代码,建议使用Knuth的样式。
空白行
使用两个空行环绕顶级函数和类定义。
类中的方法定义由单个空行包围。
可以使用额外的空白行(谨慎地)来分离相关功能组。在一堆相关的单行(例如,一组虚拟实现)之间可以省略空行。
在函数中使用空行,谨慎地指示逻辑部分。
Python接受control-L(即^ L)换页符作为空格;许多工具将这些字符视为页面分隔符,因此您可以使用它们来分隔文件相关部分的页面。请注意,某些编辑器和基于Web的代码查看器可能无法将control-L识别为换页符,并且会在其位置显示另一个字形。
源文件编码
核心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-1,ISO / IEC 8859-1字符集)的作者必须在此字符集中提供其名称的音译。
鼓励全球受众的开源项目采用类似的政策。