consideran este código:Python: inconsistencia en la forma en que define la función __setattr__?
class Foo1(dict):
def __getattr__(self, key): return self[key]
def __setattr__(self, key, value): self[key] = value
class Foo2(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
o1 = Foo1()
o1.x = 42
print(o1, o1.x)
o2 = Foo2()
o2.x = 42
print(o2, o2.x)
Yo esperaría que la misma salida. Sin embargo, con CPython 2.5, 2.6 (de manera similar en 3.2) me sale:
({'x': 42}, 42)
({}, 42)
Con PyPy 1.5.0, puedo obtener el resultado esperado:
({'x': 42}, 42)
({'x': 42}, 42)
que es la salida "derecho"? (O lo que debería ser la salida de acuerdo con la documentación de Python?)
Here es el informe de error para CPython.
Interesante rompecabezas. Me pregunto si el comportamiento de CPython tiene algo que ver con 'dict .__ setitem__' siendo un * slot wrapper *. – NPE