PEP 8的代码示例有冲突(我认为),我很好奇定位右花括号的约定。
在indentation的顶部下方,它们与参数位于同一行。在底部附近,它讨论了定位,而是说:
多行构造的右括号/括号/括号可能会 要么排在最后一个的第一个非空白字符下 list [...]行,也可以将其排在 开始多行构造的行[...]
与上面的代码示例直接冲突。
您通常将多行语句的右花括号放在哪里,就惯例而言,您认为最佳做法是什么?
为清楚起见,下面的代码示例演示了这些差异。
foo = long_function_name(
var_one, var_two,
var_three, var_four)
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
答案 0 :(得分:3)
您提到的两个部分的不同之处在于,第一部分是关于连续行,然后是一个块(例如多行def
或if
语句),而第二部分是关于右括号和在情感和函数调用上加上括号。开始一个块时,您不希望将右括号放在下一行的开头,因为返回到原始缩进将传达该块的结尾。一些看起来很奇怪的例子:
def long_function_foo(
var_one, var_two, var_three,
var_four
):
print('This code really looks out of place')
def long_function_bar(
var_one,
var_two
):
print('and so does this one')
PEP8允许使用所谓的垂直对齐方式,各种PEP中的许多示例都使用此约定,该约定已成为Python IDE的自动功能:
def long_function_name(var_one, var_two, var_three,
var_four, var_five):
"""Documentation would go here, which makes it look better."""
print(var_one + var_two + var_three)
但是我个人避免这样做。这是一个基于意见的主题,但我不喜欢依靠特定数量的空格来对齐。维护非常繁琐,并且过于依赖IDE智能缩进。我更喜欢这种表示法,PEP8允许使用这种表示法,但它似乎并不流行。请注意用于与函数主体区分开的双缩进:
def long_function_name(
alpha, bravo, charlie, delta, echo, foxtrot,
hotel, indiana):
"""Documentation would go here."""
print(var_one + var_two + var_three)
关于函数调用和分配,PEP8没有明确的答案。可以缩进右括号,以模仿下一条指令缩进较少时块如何结束。
foo = bar(
1, 2, 3
)
垂直对齐非常流行,我承认它看起来不错,但是我不想再强迫将来的代码阅读者使用缩进大小,所以我避免了这一点:
foo = bar(1, 2, 3, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14)
或者也可以将右大括号/括号左对齐:
foo = bar(
1, 2, 3
)
出于C ++,Java和JavaScript的背景,我使用第二个选项。
答案 1 :(得分:2)
这里没有冲突,因为PEP8专门说:
多行构造上的右括号/括号/括号可能 要么在最后一个字符的第一个非空白字符下对齐 列表行,如:
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 :(得分:1)
这是来自 google 的tensorflow和 facebook 的pytorch的两个代码段。
Tensorflow
if (not input_saved_model_dir and
not saver_lib.checkpoint_exists(input_checkpoint)):
print("Input checkpoint '" + input_checkpoint + "' doesn't exist!")
火炬
ALL_TENSORTYPES = [torch.float,
torch.double,
torch.half]
在两者中,他们都使用了同一行右括号。因此,我认为最好遵循这一点。