Python документация о методах, связанных с операторами на месте, например += и *= (или, как она их называет, расширенные арифметические задания) имеет следующее:
Эти методы должны пытаться выполнить операцию на месте (модифицировать self) и вернуть результат (который может быть, но не должен быть, self). Если определенный метод не определен, расширенное присваивание возвращается к нормальным методам.
У меня есть два тесно связанных вопроса:
- Почему необходимо возвращать что-либо из этих методов, если в документации указано, что, если они будут реализованы, они все равно должны делать что-то на месте? Почему операторы расширенного присваивания просто не выполняют избыточное присваивание в случае, когда реализована
__iadd__? - При каких обстоятельствах имеет смысл возвращать что-то отличное от
selfиз расширенного метода присваивания?
Небольшое экспериментирование показывает, что неизменяемые типы Python не реализуют __iadd__ (что согласуется с цитируемой документацией):
>>> x = 5
>>> x.__iadd__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'
и методы __iadd__ его изменяемых типов, конечно, работают на месте и возвращают self:
>>> list1 = []
>>> list2 = list1
>>> list1 += [1,2,3]
>>> list1 is list2
True
Как таковой, я не могу понять, для чего нужна способность возвращать вещи, отличные от self от __iadd__. Похоже, было бы неправильно делать абсолютно все обстоятельства.