Esta es el arreglo más correcta que te podemos aportar, sin embargo obsérvala detenidamente y valora si se puede adaptar a tu proyecto.
Solución:
En primer lugar, debe comprender la diferencia entre __add__
y __iadd__
.
de un objeto __add__
El método es una suma regular: toma dos parámetros, devuelve su suma y no modifica ninguno de los parámetros.
de un objeto __iadd__
El método también toma dos parámetros, pero realiza el cambio en el lugar, modificando el contenido del primer parámetro. Debido a que esto requiere la mutación de objetos, los tipos inmutables (como los tipos de números estándar) no deberían tener un __iadd__
método.
a + b
usos __add__
. a += b
usos __iadd__
si existiera; si no lo hace, lo emula a través de __add__
como en tmp = a + b; a = tmp
. operator.add
y operator.iadd
difieren de la misma manera.
A la otra pregunta: operator.iadd(x, y)
no es equivalente a z = x; z += y
porque si no __iadd__
existe __add__
se utilizará en su lugar. Debe asignar el valor para asegurarse de que el resultado se almacene en ambos casos: x = operator.iadd(x, y)
.
Puedes ver esto tú mismo con bastante facilidad:
import operator
a = 1
operator.iadd(a, 2)
# a is still 1, because ints don't have __iadd__; iadd returned 3
b = ['a']
operator.iadd(b, ['b'])
# lists do have __iadd__, so b is now ['a', 'b']