Is __setitem__ method and square bracket assignment not the same?

105 views Asked by At

I assumed that square bracket assignment is a syntactic sugar for __setitem__ magic-method. But as you can see from the result of this snippet it is not.

class A(object):
    def __init__(self):
        self.value = None

    def __setitem__(self, key, value):
        self.value = value


class B(object):
    def __init__(self):
        self.a = A()

    def __getattr__(self, name):
        attribute = getattr(self.a, name)
        setattr(self, name, attribute)
        return getattr(self, name)


if __name__ == '__main__':
    b = B()
    b.__setitem__((1, 2), 4)
    b[1, 2] = 4

TypeError: 'B' object does not support item assignment

Could someone explain why square bracket assignment is not the same as __setitem__ method calling?

0

There are 0 answers