使用Python闭合花括号

时间:2018-06-25 04:39:26

标签: python pep8 convention

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',
)

3 个答案:

答案 0 :(得分:3)

您提到的两个部分的不同之处在于,第一部分是关于连续行,然后是一个块(例如多行defif语句),而第二部分是关于右括号和在情感和函数调用上加上括号。开始一个块时,您不希望将右括号放在下一行的开头,因为返回到原始缩进将传达该块的结尾。一些看起来很奇怪的例子:

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]

在两者中,他们都使用了同一行右括号。因此,我认为最好遵循这一点。