Принудительный метод вызывает стиль отступов в 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 не поддерживает.