выражения присваивания с условным выражением
Следующий фрагмент
def expensive_function(x):
return x
x = 10.5
(int(y) if y.is_integer() else y := expensive_function(x))
поднимает
SyntaxError: cannot use assignment expressions with conditional expression
Можно ли не использовать выражения присваивания таким образом?
Если нет, то что не так с моим предположением: у меня сложилось впечатление, что идея состоит в том, чтобы предварительно присвоить фиктивное значение дорогостоящей операции в одном выражении.
Чтобы прояснить идею, спрашивается, можно ли использовать операции присваивания для упрощения, назначив
expensive_function(x)
к фиктивной переменной
def expensive_function(x):
return x
x = 10.5
(int(expensive_function(x))
if expensive_function(x).is_integer()
else expensive_function(x))
2 ответа
Что о
z = int(y) if (y := expensive_function(x)).is_integer() else y
?
Собственно, в
a if cond else b
, есть два условных выражения:
a
- и
b
-члены. Но средний член, т.е.
cond
один не является условным: он всегда вычисляется, что объясняет, почему использование оператора присваивания не вызывает ошибки.
Подход до версии 3.8 (т.е. без оператора Walrus) может быть
z = (
lambda y: int(y) if y.is_integer() else y
)(
expensive_function(x)
)
int(y) if y.is_integer() else y := expensive_function(x)
эквивалентно
def foo(x):
if y.is_integer():
return int(y)
else:
y = expensive_function(x)
return y
foo(x)
Теперь вы видите, в чем проблема.
y
не определено!