Закрывающие скобки с Python - PullRequest
0 голосов
/ 25 июня 2018

PEP 8 имеет противоречивые примеры кода (на мой взгляд), и мне любопытно, что такое соглашение для размещения закрывающих скобок.
Под вершиной отступа ониВы находитесь на одной линии с параметрами.В нижней части он обсуждает позиционирование и вместо этого говорит:

Закрывающая скобка / скобка / скобка на многострочных конструкциях может располагаться либо под первым непробельным символом последней строки списка [...] или он может быть выстроен под первым символом строки, которая начинает многострочную конструкцию [...]

, которая напрямую противоречит приведенным выше примерам кода.
Где вы обычно размещаетезакрывающие скобки для многострочных операторов, и что, по вашему мнению, является наилучшей практикой с точки зрения соглашения?

Просто для ясности, вот примеры кода, демонстрирующие различия.

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 голосов
/ 25 июня 2018

Два упомянутых вами раздела отличаются тем, что первый касается строк продолжения, за которыми следует блок (например, многострочный оператор 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 используют это соглашение, которое стало автоматизированной функцией IDE Python:

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, я использую второй вариант.

0 голосов
/ 25 июня 2018

Это два фрагмента кода из тензорного потока google и pytorch facebook .

Tensorflow

if (not input_saved_model_dir and
      not saver_lib.checkpoint_exists(input_checkpoint)):
    print("Input checkpoint '" + input_checkpoint + "' doesn't exist!")

Pytorch

ALL_TENSORTYPES = [torch.float,
                   torch.double,
                   torch.half]

В обоих случаях они использовали та же самая строка стратегия закрывающих скобок.Так что, на мой взгляд, лучше следовать этому.

0 голосов
/ 25 июня 2018

Здесь нет конфликта, так как 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',
)

так что оба соглашения приемлемы.

Лично я предпочитаю последнее соглашение, но это только я.

...