2014-02-11 120 views
0

实现了将功能添加到现有项目的目标 - IntervalMap project!。 由于内部运营商(__add__,__mul__等)尚未实施,因此需要订阅他们。TypeError:不支持的操作数类型为+:'int'和'IntervalMap'

这是我在__add__内置实现来执行 intervalmap另外的代码。

# ... 

def __add__(self, other): 
    """ 
    a = x + y 
    """ 

    aux = intervalmap() 

    if isinstance(other, self.__class__): 

     ruler = self._bounds + other._bounds 
     ruler = map(ruler.sort(), ruler) 

     for i, x in enumerate(ruler): 

      if i > 0: 
       _slice = slice(ruler[i-1], x, None) 
       point = (_slice.start + _slice.stop)/2.0 

       if self[point] is None: 
        aux.__setitem__(_slice, other[point]) 
       elif other[point] is None: 
        aux.__setitem__(_slice, self[point]) 
       else: 
        aux.__setitem__(_slice, self[point] + other[point]) 

    if isinstance(other, (int,float)): 

     for i, x in enumerate(self._bounds): 

      if i > 0: 
       point = (self._bounds[i-1] + x)/2 
       aux[self._bounds[i-1]:x] = self[point] + other 

    return aux 

# ... 

if __name__ == '__main__': 
     x = intervalmap() 
     y = intervalmap() 

     x[1:2] = 6 
     x[4:5] = 1 
     x[7:8] = 5 

     y[0:3] = 4 
     y[3:6] = 2 
     y[6:9] = 11 

     print x 
     print y 

输出

>>> {[1, 2] => 6, [4, 5] => 1, [7, 8] => 5} 

>>> {[0, 3] => 4, [3, 6] => 2, [6, 9] => 11} 

      a = x + y 
      b = y + x 
      print a 
      print b 


>>> {[0, 1] => 4, [1, 2] => 10, [2, 3] => 4, [3, 4] => 2, [4, 5] => 3, [5, 6] => 2, [6, 7] => 11, [7, 8] => 16, [8, 9] => 11} 

>>> {[0, 1] => 4, [1, 2] => 10, [2, 3] => 4, [3, 4] => 2, [4, 5] => 3, [5, 6] => 2, [6, 7] => 11, [7, 8] => 16, [8, 9] => 11} 

      a = y + 2 
      print a 
      b = 2 + y 
      print b 

>>> {[0, 3] => 6, [3, 6] => 4, [6, 9] => 13} 

Traceback (most recent call last): File "/home/pc/workspace/simulador-mti/source/y.py", line 73, in <module> b = 2 + y 

TypeError: unsupported operand type(s) for +: 'int' and 'IntervalMap' 

想成为abble到恒定数量添加到intervalmap对象不管 的位置,右或左操作数。我如何添加一个数字作为左操作数?

顺便说一句,有没有人看到一种通用的方式来做到这一点? 就像传递给更新函数x.update(y, lambda x,y: x+y)来执行相同的事情。

回答

1

__add__之外,您还可以定义__radd__方法。

套用一个documentation

 
__radd__ is only called if the left operand does not support the add operation 
and the operands are of different types. [2] 
For instance, to evaluate the expression x + y, where y is an instance of a class 
that has __radd__() method, 
y.__radd__(x) is called if x.__add__(y) returns NotImplemented. 

它应该是这样的:

class X(object): 
    def __init__(self, val): 
     self.val = val 

    def __add__(self, other): 
     if isinstance(other, X): 
      return X(self.val + other.val) 
     else: 
      return X(self.val + other) 

    def __radd__(self, other): 
     return self.__add__(other) 

X(3) + 4 # calls `__add__` 
4 + X(3) # calls `__radd__` 
+0

问题解决了。谢谢。 – Jack

相关问题