Python 2.7 docs для модуля weakref говорит следующее:
Не все объекты могут быть слабо указаны; те объекты, которые могут включают экземпляры классов, функции, написанные на Python (но не в C), методы (как связанные, так и несвязанные),...
И Python 3.3 docs для модуля weakref говорят это:
Не все объекты могут быть слабо указаны; те объекты, которые могут включают экземпляры классов, функции, написанные на Python (но не в C), методы экземпляра,...
Для меня это указывает на то, что слабые ссылки на связанные методы (во всех версиях Python 2.7 - 3.3) должны быть хорошими, а слабые ссылки на несвязанные методы должны быть хорошими в Python 2.7.
Тем не менее, в Python 2.7, создание слабой ссылки на метод (связанный или несвязанный) приводит к мертвой слабойреф:
>>> def isDead(wr): print 'dead!'
...
>>> class Foo:
... def bar(self): pass
...
>>> wr=weakref.ref(Foo.bar, isDead)
dead!
>>> wr() is None
True
>>> foo=Foo()
>>> wr=weakref.ref(foo.bar, isDead)
dead!
>>> wr() is None
True
Не то, что я ожидал бы на основе документов.
Аналогично, в Python 3.3, слабыйref для связанного метода умирает при создании:
>>> wr=weakref.ref(Foo.bar, isDead)
>>> wr() is None
False
>>> foo=Foo()
>>> wr=weakref.ref(foo.bar, isDead)
dead!
>>> wr() is None
True
Снова не то, что я ожидал бы на основе документов.
Поскольку эта формулировка существует с момента появления 2.7, она, безусловно, не является надзором. Может ли кто-нибудь объяснить, как заявления и наблюдаемое поведение на самом деле не противоречат?
Редактирование/разъяснение: Другими словами, утверждение для 3.3 говорит, что "методы экземпляра могут быть слабыми"; не означает ли это, что разумно ожидать, что weakref.ref(метод экземпляра)() не является None? и если это None, то "методы экземпляра" не должны быть перечислены среди типов объектов, которые могут быть слабыми ссылками?