[Python-Dev] summing integer and class

Igor Vasilyev igor.vasilyev at oracle.com
Thu Oct 3 15:45:18 CEST 2013


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


More information about the Python-Dev mailing list