Идиома Python для выражения «... if ... else ...» - PullRequest
6 голосов
/ 27 марта 2010

Как написать выражение короче:

return '%.0f' % float_var if float_var else float_var

или

if float_var:
    return formatted_string
else:
    return None

Спасибо!

Ответы [ 5 ]

27 голосов
/ 27 марта 2010

Выражение <value> if <condition> else <other_value> уже довольно идиоматично - безусловно, больше, чем в другом примере, и, вероятно, предпочтительнее, когда <value> прост. Это троичный оператор Python, поэтому, если вы искали что-то вроде <condition> ? <value> : <other_value>, этого не существует.

Если для вычисления <value> или <other_value> требуется несколько шагов, используйте более длинную альтернативу if: ... else: ....

4 голосов
/ 27 марта 2010

Я бы использовал скобки, чтобы сделать выражение более читабельным:

return ('%.0f' % float_var) if float_var else float_var

Когда я впервые увидел его, я прочитал его как

return '%.0f' % (float_var if float_var else float_var)

что было бы глупо. Я должен был попробовать, чтобы убедиться, как это работает.

Кстати, ваш первый пример не эквивалентен вашему второму примеру

if float_var:
    return formatted_string
else:
    return None

Это всегда будет возвращать либо отформатированную строку, либо None. Ваш первый пример, если вы передадите что-нибудь, что оценивается как False (False, 0, 0.0, "", [] и т. Д.), Вернет это без изменений, поэтому тип возвращаемого значения может быть string, boolean, list, int, float и т.д. вероятно, не то, что вы хотите, особенно если 0.0 является допустимым значением для float_var. Я бы изменил ваш код на:

return ('%.0f' % float_var) if isinstance(float_var, float) else None

альтернативно:

try:
    return "%.0f" % float_var
except TypeError:
    return None

, который будет работать для других целых чисел (и длинных) путем преобразования их в число с плавающей точкой.

2 голосов
/ 27 марта 2010
  • Не ясно, что именно вы хотите сделать.

    1. Самое буквальное толкование было бы так:

      >>> float_var = 4.5
      >>> '%.0f' % float_var if float_var else float_var
      '5' # This is a string
      >>> float_var = 0.0
      >>> '%.0f' % float_var if float_var else float_var
      0.0 # This is a float
      

      что я почти уверен, что вы не хотели.

    2. Полагаю, вы хотите проверить None на "if float_var"? Если это так, вы всегда пишете это «if foo is not None», а не «if foo», причем первый вариант более понятен и менее подвержен ошибкам.

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

  • Короче не всегда лучше. Ваши отрывки не болезненно длинные или громоздкие. Фактически, вы захотите сделать их немного длиннее , если будете использовать их, чтобы избежать потенциальной ошибки.

    • Кто-то может предложить использовать для этого поведение короткого замыкания or. Однако это затрудняет чтение кода и не позволяет указывать между None и другими ложными значениями, что часто приводит к ошибкам.
1 голос
/ 27 марта 2010

Если вы используете, уже используете v if c else u, вы уже используете наиболее читаемый и эффективный троичный оператор.

Есть другие способы , но они страдают от читабельности.

0 голосов
/ 27 марта 2010
float_var and "%.0f" % float_vav

Разве это не круто?

...