Seite 1 von 1

Unterschied operator.add / operator.iadd

Verfasst: Freitag 26. August 2011, 15:16
von mutetella
Hallo,

mir erschließt sich der Unterschied nicht ganz:

Code: Alles auswählen

>>> a = 5
>>> operator.add(a,1)
6
>>> a
5
>>> operator.iadd(a,1)
6
>>> a
5
Bei 'operator.iadd' spricht die Doku doch von einem 'in-place' operator. Ich würde also folgendes erwarten:

Code: Alles auswählen

>>> a = 5
>>> operator.iadd(a, 1)
>>> a
6
Was macht 'iadd' also anderes als 'add'?

mutetella

Re: Unterschied operator.add / operator.iadd

Verfasst: Freitag 26. August 2011, 15:52
von pillmuncher
guckstu:

Code: Alles auswählen

class Foo(object):
    def __init__(self, val):
        self._val = val
    def __str__(self):
        return 'Foo(%d)' % self._val
    def __add__(self, number):
        return Foo(self._val + number)
    def __iadd__(self, number):
        self._val += number
        return self

from operator import add, iadd

a = Foo(2)
print add(a, 7)
print a
print iadd(a, 7)
print a
Ergebnis:

Code: Alles auswählen

Foo(9)
Foo(2)
Foo(9)
Foo(9)
Nicht vergessen: ints sind immutable, Foos mutable. :wink:

Gruß,
Mick.

Re: Unterschied operator.add / operator.iadd

Verfasst: Freitag 26. August 2011, 19:25
von mutetella
@pillmuncher:
Danke für das Beispiel...

Das heißt aber auch, dass 'iadd' nur dann "in place" arbeitet, wenn das Objekt auch eine '__iadd__'-Methode besitzt.
'operator.add/operator.iadd' macht also letztlich nichts anderes, als 'object.__add__/object.__iadd__' aufzurufen.

Sehe ich das richtig?

mutetella

Re: Unterschied operator.add / operator.iadd

Verfasst: Freitag 26. August 2011, 19:34
von EyDu
Das hast du im Prinzip richtig verstanden. `operator.add` entspricht dem Aufruf von `+`, `operator.iadd` hingegen `+=`. Was genau passiert ist dann natürlich von den entsprechenden Objekten abhängig.