Как сделать разрыв строки для троичного оператора Python?
Иногда строка, содержащая тернарный оператор в Python, становится слишком длинной:
answer = 'Ten for that? You must be mad!' if does_not_haggle(brian) else "It worth ten if it worth a shekel."
Есть ли рекомендуемый способ сделать разрыв строки на 79 символов с помощью тернарного оператора? Я не нашел его в PEP 8.
Ответы
Ответ 1
Вы всегда можете расширить логическую строку через несколько физических строк с круглыми скобками:
answer = (
'Ten for that? You must be mad!' if does_not_haggle(brian)
else "It worth ten if it worth a shekel.")
Это называется неявная линия, соединяющая.
В приведенном выше примере используется стиль PEP8 all-indented-one-step-more (называемый висячий отступ). Вы также можете отступать дополнительные строки в соответствии с открывающей скобкой:
answer = ('Ten for that? You must be mad!' if does_not_haggle(brian)
else "It worth ten if it worth a shekel.")
но это дает вам максимум максимум на 80 столбцов.
Где именно вы помещаете порции if
и else
, зависит от вас; Я использовал свои личные предпочтения выше, но нет определенного стиля для оператора, с которым все согласны.
Ответ 2
PEP8 говорит, что предпочтительный способ разрыва длинных строк - использовать круглые скобки:
Предпочтительным способом переноса длинных строк является использование Python подразумеваемых продолжение строки в круглых скобках, скобках и фигурных скобках. Длинные линии могут быть разбиты на несколько строк путем обертывания выражений в круглые скобки. Они должны использоваться вместо использования обратной косой черты для продолжения строки.
answer = ('Ten for that? You must be mad!'
if does_not_haggle(brian)
else "It worth ten if it worth a shekel.")
Ответ 3
Имейте в виду этот совет от Zen of Python:
"Чтение рассчитывается".
Тернарный оператор наиболее читаем, когда он находится на одной строке.
x = y if z else w
Когда ваши условия или переменные вытесняют строку, состоящую из 79 символов (см. PEP8), читаемость начинает страдать. (Считываемость также объясняется тем, почему лучше всего хранить разборчивость/список).
Итак, вместо того, чтобы пытаться разбить строку с помощью круглых скобок, вы можете обнаружить, что она более читаема, если вы конвертируете ее в обычный блок if
.
if does_not_haggle(brian):
answer = 'Ten for that? You must be mad!'
else:
answer = "It worth ten if it worth a shekel."
БОНУС: вышеупомянутый рефакторинг показывает другую проблему с читабельностью: does_not_haggle
- инвертированная логика. Это было бы еще более читаемым, если вы можете переписать функцию:
if haggles(brian):
answer = "It worth ten if it worth a shekel."
else:
answer = 'Ten for that? You must be mad!'