summing integer and class
![](https://secure.gravatar.com/avatar/5c578baa1b09b9e098891fe1dabea6d2.jpg?s=120&d=mm&r=g)
Hi. Example test.py: class A(): def __add__(self, var): print("I'm in A class") return 5 a = A() a+1 1+a Execution: python test.py I'm in A class Traceback (most recent call last): File "../../test.py", line 7, in <module> 1+a TypeError: unsupported operand type(s) for +: 'int' and 'instance' So adding integer to class works fine, but adding class to integer fails. I could not understand why it happens. In objects/abstact.c we have the following function: static PyObject * binary_op1(PyObject *v, PyObject *w, const int op_slot) { PyObject *x; binaryfunc slotv = NULL; binaryfunc slotw = NULL; if (v->ob_type->tp_as_number != NULL) slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot); if (w->ob_type != v->ob_type && w->ob_type->tp_as_number != NULL) { slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { x = slotw(v, w); if (x != Py_NotImplemented) return x; Py_DECREF(x); /* can't do it */ slotw = NULL; } x = slotv(v, w); if (x != Py_NotImplemented) return x; Py_DECREF(x); /* can't do it */ } if (slotw) { x = slotw(v, w); if (x != Py_NotImplemented) return x; Py_DECREF(x); /* can't do it */ } Py_RETURN_NOTIMPLEMENTED; } When we adding class to integer we have both slotv and slotw. x = slotv(v, w); -> returns Py_NotImplemented. But in this case we should execute x = slotw(v, w); and function should be completed in the same way as when we adding integer to class. Can someone advise please where I mistake. -- thanks, Igor Vasilyev
![](https://secure.gravatar.com/avatar/d67ab5d94c2fed8ab6b727b62dc1b213.jpg?s=120&d=mm&r=g)
On Thu, Oct 3, 2013 at 11:09 PM, Игорь Васильев <vasilyev_igor@inbox.ru> wrote:
When we adding class to integer we have both slotv and slotw. x = slotv(v, w); -> returns Py_NotImplemented. But in this case we should execute x = slotw(v, w); and function should be completed in the same way as when we adding integer to class.
Can someone advise please where I mistake.
No need to dig into the CPython source for this, the answer's pretty simple: 1+a is handled by __radd__ not __add__.
class A(): def __add__(self, var): print("I'm in A class") return 5 def __radd__(self, var): print("I'm in A class, too") return 6
a=A() a+1 I'm in A class 5 1+a I'm in A class, too 6
You could ask this sort of thing on python-list@python.org rather than python-dev. ChrisA
participants (2)
-
Chris Angelico
-
Игорь Васильев