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__
. Похоже, было бы неправильно делать абсолютно все обстоятельства.