Более короткий, более питонический способ написания оператора if

У меня есть это

bc = 'off'

if c.page == 'blog':
    bc = 'on'

print bc

Есть ли более питонический (и/или более короткий) способ записи этого в python?

Ответ 1

Самый короткий из них должен быть:

bc = 'on' if c.page=='blog' else 'off'

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

Ответ 2

Это:

  • определенно короче
  • возможно, Pythonic (pre-Python 2.5, который ввел спорный синтаксис X if Z else Y)
  • сомнительно читаемый. Учитывая эти оговорки, здесь говорится:

    bc = ("off","on")[c.page=="blog"]
    

EDIT: согласно запросу обобщенная форма:

   result = (on_false, on_true)[condition]

Объяснение: condition может быть любым, что оценивается в булевом. Затем он рассматривается как целое число, поскольку он используется для индексации кортежа: False == 0, True == 1, который затем выбирает правильный элемент из кортежа.

Ответ 3

Ну, не будучи питоном-парнем, пожалуйста, возьмите это с огромным количеством соли, но, написав (и, с большим трудом прочитав) много умного кода на протяжении многих лет, я с сильным преимуществом теперь читаемый код. Я понял суть вашего исходного кода, хотя я никем не являюсь парнем Python. Конечно, вы могли бы скрыть это и, возможно, произвести впечатление на выигрыш Python или два, но почему?

Ответ 4

Или вы можете использовать оператор inline if:

>>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off'

Там немного написания этой функции в в этом блоге, а соответствующий PEP - PEP308. Оператор inline if был введен в Python 2.5.

Это может быть немного менее pythonic, но вы можете использовать и/или таким образом:

>>> cpage = 'asdf'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'off'
>>> cpage = 'blog'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'on'

Этот используется чаще в лямбда-операторах, чем в строке, но форма

 A and B or C

похож на

   if A:
       return B
   else:
       return C

Я собирался выписать немного более подробное объяснение, но они лучше рассмотрели в Dive into Python. Они также отметили пару предостережений, которые вам, вероятно, нужно знать.

Ответ 5

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

want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]

Я предпочитаю это и/или решения индексирования кортежей в соответствии с общей рубрикой, предпочитающей вычисление для тестирования.

Ответ 6

Вы можете использовать

a = b if c else d 

но если вы используете версию python до 2.5,

bc = c.page == "blog" and "on" or "off"

также может сделать трюк.