implementing add and iadd for custom class in python?
Question: I am writing a `Queue` class that wraps list for most of its operations. But I
do not sublcass from `list`, since I do not want to provide all the `list
API's`. I have my code pasted below. The `add` method seems to work fine, but
`iadd` seems to go wrong, it is printing none. Here is the code:

    
    
    import copy
    from iterator import Iterator
    class Abstractstruc(object):
        def __init__(self):
            assert False
        def __str__(self):
            return "<%s: %s>" %(self.__class__.__name__,self.container)
    
    class Queue(Abstractstruc,Iterator):
    
        def __init__(self,value=[]):
            self.container=[]
            self.size=0
            self.concat(value)
    
        def add(self, data):
                self.container.append(data)
        def __add__(self,other):
            return Queue(self.container + other.container)
    
    
        def __iadd__(self,other):
            for i in other.container:
                self.add(i)
    
        def  remove(self):
            self.container.pop(0)
    
    
        def peek(self):
            return self.container[0]
    
    
        def __getitem__(self,index):
            return self.container[index]
    
    
        def __iter__(self):
            return Iterator(self.container)
    
        def concat(self,value):
            for i in value:
                self.add(i)
    
        def __bool__(self):
            return len(self.container)>0
    
        def __len__(self):
            return len(self.container)
    
    
        def __deepcopy__(self,memo):
            return Queue(copy.deepcopy(self.container,memo))
    
    
    if __name__=='__main__':
        q5 = Queue()
        q5.add("hello")
    
        q6 = Queue()
        q6.add("world")
    
        q5 = q5+q6
    
        print q5
        q5+=q6
        print q5    
    

Output:

    
    
    <Queue: ['hello', 'world']>
    None
    


Answer: `__iadd__` needs to return `self` when adding in-place:

    
    
    def __iadd__(self,other):
        for i in other.container:
            self.add(i)
        return self
    

`__iadd__` needs to return the resulting object; for immutable types the new
object, for mutable types, `self`. Quoting the [in-place operator hooks
documentation](http://docs.python.org/2/reference/datamodel.html#object.__iadd__):

> These methods should attempt to do the operation in-place (modifying `self`)
> and return the result (which could be, but does not have to be, `self`).

