Часто, у вас есть уже лучший вариант.
Вы всегда можете создать новую область, чтобы связать значение переменной:
(lambda res: do_something_with(res) if res else None)(returns_value_or_none(arg))
Но это, конечно, не будет более удобным для чтения, или более Pythonic.
Если вы просто хотите сохранить одну строку, вы можете сделать это:
res = returns_value_or_none(arg)
if res: do_something_with(res)
Это более читаемым иногда, но, как правило, это чистый убыток.
Другой способ борьбы с этим было бы изменить do_something_with
принимать None
и ничего не делать. Это не так часто встречается в Python, как это происходит, скажем, Smalltalk или Swift, но иногда оно имеет свое место.
Трудно понять, почему с подобным примером игрушка, но если вы вызываете эти функции 70 раз, ставя чек в одном месте, внутри функции, а не в 70 местах, везде, где она называется, является очевидная победа. (Тем более, что вы, вероятно, положил его в 68 местах и забыть другой 2.)
последнее, но не менее, во многих случаях правильный ответ исключения. Ваш do_something_with
, вероятно, уже поднимается, если вы пройдете None
. И вы можете с уверенностью изменить returns_value_or_none
на returns_value_or_raises
.
Опять же, в этом примере игрушек это будет выглядеть скорее как больше кода. Но в реальном коде часто бывает целесообразно поставить целый блок кода внутри try
/except
и обрабатывать все ошибки сразу в конце. Или даже позволить исключениям просачиваться на более высокий уровень, с которым легче справиться.
Конечно, это не подходит в каждом случае; если вы ожидаете, что None
будет частым и вполне разумным ответом, и просто хотите пропустить один шаг, а не прервать всю цепочку операций, проверка или прохождение через None
будет иметь гораздо больше смысла, чем засорять ваш код небольшими try
блоки.
Первый способ у вас в порядке. Просто не забудьте использовать 'if res is None ', если возвращаемое значение может быть некоторым другим допустимым, но ложным значением (например, пустой строкой). – wim
Что вы действительно ищете, это C-style 'if res = spam():' или 'if (ch = getch())! = EOF:', а у Python этого нет. У Python есть веские причины; У Свифта есть разные веские причины; если вы разрабатываете новый язык и, сохраняя одну строку или 5 символов, вполне может стоить, если в противном случае нет веских причин, но в противном случае у вас могут быть веские причины. – abarnert