Как сделать разрыв строки для троичного оператора 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!'