一、缩进
延续行连接各部分可以直接使用Python大括号、中括号以及小括号里面的垂直式隐线,或者使用悬挂缩进。当使用悬挂缩进时需要考虑以下问题:第一行不该有参数,更远的缩进使用时可以清晰的区分它本身是一个延续行。
正确:
# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
var_three, var_four)
# Add 4 spaces (an extra level of indentation) to distinguish arguments 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)
错误:
# 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)
可选择:
# Hanging indents *may* be indented to other than 4 spaces.
foo = long_function_name(
var_one, var_two,
var_three, var_four)
当if-statement条件部分足够长需要写成多行时,由两个字符(if)加一个空格,以及一个开的小括号组成的4位缩进的多行条件句是没有意义的。这会跟if执行句里面的缩进成分产生视觉矛盾,因为它们同样缩进4位。本PEP没有在如何区分条件句与执行句摆出明确的态度。该情况下可接受的选择包含但不仅限于:
# 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',
)
二、最大行长
Python标准图书库是保守的,需要限定每行字符为79个。
连接长代码行的倾向性用法是使用Python在括号中的隐含行延续。长代码行可以打断为多行通过在括号里包装表达句。比较好的做法是使用反斜杠作为行延续。
反斜杆很多情况下仍旧是适用的。比如,长而多的with语句不能使用隐含延续,而反斜杆可以使用。
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(file_1.read())
三、断行需要在二元运算符前还是后
很长一段时间,推荐的方式是在二元运算符后面断行。但是这会从两方面损害可读性:运算符在屏幕的不同列零散分布,并且每个运算符与操作内容相分离而放置在前一行末尾。这里,眼睛不得不额外费点功夫看看哪些项目被加上哪些被减去。
# No: operators sit far away from their operands
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
为了解决这个可读性问题,数学家与他们的编辑者依据相反的惯例。Donald Knuth在他的系列“Computers and Type setting”阐述了传统规则:“尽管在段落里面的公式总是在二元运算符以及关系后面打断换行,展示的公式总是在二元运算符前面打断换行。”
依据数学的传统惯例通常可以形成更有可读性的代码。
# Yes: easy to match operators with operands
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
在Python代码中,不管是在二元运算符前面还是后面打断换行都是允许的,只要惯例在局部保持一致性,对于新的代码,Knuth的风格值得推荐。
四、表达式语句中的空白
避免在以下情况出现额外的空格。
在括号里紧跟着
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
但是,在片段里面,冒号充当二元运算符,应该在两边保持等量空格(把它当做运算符最低优先级)。在延伸的片段中,冒号一定要有等量的空格。除非当一个片段的参数省略了,空格可以省略。
正确:
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]
错误:
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]
End.
来源:数据人网