Почему += не работает в return и print()?
При следующем коде
class Num():
def __init__(self, val):
self.val = val
def __iadd__(self, other):
return Num(self.val + other.val)
a = Num(4)
b = Num(6)
print(a += b)
Наткнулся на следующую ошибку:
File "main.py", line 12
print(a += b)
^
SyntaxError: invalid syntax
Если += поменять на +, то всё корректно отрабатывает, но с += почему-то падает ошибка. При этом в какой-нибудь функции return a += b создаст такую же проблему.
Вопрос: Почему += вызывает ошибки, если __iadd__ возвращает значение?
Ответы (3 шт):
Присваивание в print сделать можно, вот так:
class Num():
def __init__(self, val):
self.val = val
def __add__(self, other): # (1)
return Num(self.val + other.val)
a = Num(4)
b = Num(6)
print(a := a + b) # (2)
- Изменить
__iadd__на__add__ - Использовать "моржовый оператор".
Вы, наверно, программировали в Си или подобном языке.
Но Питон не Cи (C/C++). B Cи каждое присвоение является тоже выражением (с точно определенным значением).
В Питоне a += b не имеет значение, даже не None. Это только команда. :-(
И хотя функция__iadd__() возвращает значение, оно применится только для присвоения.
Примечание:
Чтобы в Питоне было возможно одновременно использовать присвоение как выражение, с версии Питон 3.8 возможно вместо оператора = применить оператор := — тогда такое присвоение будет тоже выражением, аналогично Cи.
Но нет оператора :+=.
Значит, чтобы ваш пример работал, нужно заменить a += b выражением a := a + b.
Оператор += не ожидает возвращения значения из метода __iadd__. Он предполагает, что __iadd__ изменит текущий объект и вернет его, но не ожидает, что возвращенное значение будет использовано как выражение.
Если нужно использовать += внутри print(), попробуй переопределить метод __add__ вместо __iadd__ и возвращать новый объект.