[Python-Dev] summing integer and class

2013年10月03日 08:40:56 -0700

 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
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to