Принудительный метод вызывает стиль отступов в Python

Из чтения PEP-8 я получаю, что вы должны поместить закрывающую скобку в ту же строку, что и последний аргумент в вызовах функций:

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False)

Вероятно, длинные выражения лучше всего избегать. Но если это нежелательно, , как вы можете использовать вызовы с несколькими цепями? Должен ли закрытый парик быть на новой строке?

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False
).values_list('value', flat=True)

Как насчет методов без аргументов? Как записать их на несколько строк без ссылки на промежуточные возвращаемые значения?

ShortName.objects.distinct(
    ).filter().values() # looks ugly

Обновление: существует дублированный вопрос Как разбить цепочку цепочечных методов на Python?. принятый ответ предлагает знакомый стиль jQuery для начала каждой новой строки с точкой. Автор не дает никаких оснований или авторитетных ссылок, поэтому я хотел бы получить подтверждение по такому стилю или альтернативе.

Ответ 1

Это случай, когда символ продолжения строки является предпочтительным для открытия круглых скобок.

ShortName.objects.distinct() \
         .filter().values()      # looks better

Потребность в этом стиле становится более очевидной, поскольку имена методов становятся длиннее, а методы начинают принимать аргументы:

return some_collection.get_objects(locator=l5) \
                      .get_distinct(case_insensitive=True) \
                      .filter(predicate=query(q5)) \
                      .values()

PEP 8 намеревается интерпретировать с мерой здравого смысла и глаза как для практического, так и для красивого. С радостью нарушайте любое руководство PEP 8, которое приводит к уродливому или трудно читаемому коду.

Если вы считаете, что часто встречаетесь с PEP 8, это может быть признаком того, что есть проблемы с читабельностью, которые превосходят ваш выбор пробелов: -)

Ответ 2

Я думаю, что лучше всего использовать() для принудительного соединения линий и для этого:

(ShortName.objects.distinct() # Look ma!
 .filter(product__photo__stickitem__isnull=False) # Comments are allowed
 .values_list('value', flat=True))

Это не идеально, но мне нравится, что он выделяется визуально и делает несколько очевидным, что такое цепочка вызовов. Он позволяет использовать комментарии конца строки, которые \ newline не поддерживает.