У меня есть это
bc = 'off'
if c.page == 'blog':
bc = 'on'
print bc
Есть ли более питонический (и/или более короткий) способ записи этого в python?
У меня есть это
bc = 'off'
if c.page == 'blog':
bc = 'on'
print bc
Есть ли более питонический (и/или более короткий) способ записи этого в python?
Самый короткий из них должен быть:
bc = 'on' if c.page=='blog' else 'off'
В целом это может показаться немного запутанным, поэтому вы должны использовать его только тогда, когда ясно, что это значит. Не используйте его для больших булевых предложений, так как он начинает выглядеть уродливо.
Это:
X if Z else Y
)сомнительно читаемый. Учитывая эти оговорки, здесь говорится:
bc = ("off","on")[c.page=="blog"]
EDIT: согласно запросу обобщенная форма:
result = (on_false, on_true)[condition]
Объяснение: condition
может быть любым, что оценивается в булевом. Затем он рассматривается как целое число, поскольку он используется для индексации кортежа: False == 0
, True == 1
, который затем выбирает правильный элемент из кортежа.
Ну, не будучи питоном-парнем, пожалуйста, возьмите это с огромным количеством соли, но, написав (и, с большим трудом прочитав) много умного кода на протяжении многих лет, я с сильным преимуществом теперь читаемый код. Я понял суть вашего исходного кода, хотя я никем не являюсь парнем Python. Конечно, вы могли бы скрыть это и, возможно, произвести впечатление на выигрыш Python или два, но почему?
Или вы можете использовать оператор 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. Они также отметили пару предостережений, которые вам, вероятно, нужно знать.
Другая возможность - использовать dict, если вы можете вычислить значения вне функции, которая обращается к ним (т.е. значения являются статическими, что также затрагивает проблему оценки в комментариях с комментариями).
want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]
Я предпочитаю это и/или решения индексирования кортежей в соответствии с общей рубрикой, предпочитающей вычисление для тестирования.
Вы можете использовать
a = b if c else d
но если вы используете версию python до 2.5,
bc = c.page == "blog" and "on" or "off"
также может сделать трюк.