Python: несогласованность в способе определения функции __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)

Я ожидал бы того же результата. Однако с CPython 2.5, 2.6 (аналогично 3.2) я получаю:

({'x': 42}, 42)
({}, 42)

С PyPy 1.5.0 я получаю ожидаемый результат:

({'x': 42}, 42)
({'x': 42}, 42)

Какой результат "правильный"? (Или каким должен быть результат в соответствии с документацией Python?)


Здесь отчет об ошибке для CPython.

15
задан Albert 23 April 2012 в 22:54
поделиться