выражения присваивания с условным выражением

Следующий фрагмент

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 не определено!

Другие вопросы по тегам