Рассмотрим этот код:
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)
Я ожидал бы того же результата. Однако с CPython 2.5, 2.6 (аналогично 3.2) я получаю:
({'x': 42}, 42)
({}, 42)
С PyPy 1.5.0 я получаю ожидаемый результат:
({'x': 42}, 42)
({'x': 42}, 42)
Какой результат "правильный"? (Или каким должен быть результат в соответствии с документацией Python?)
Здесь отчет об ошибке для CPython.