を使用しないようにデコレータを変更しようとするとweakref
、次の動作に遭遇しました。
import weakref
class descriptor(object):
def __get__(self, instance, owner):
return proxy(instance)
class proxy(object):
def __init__(self, instance):
self.instance = instance
def __iadd__(self, other):
return self
class A(object):
descr = descriptor()
def is_leaky(test_fn):
a = A()
wr = weakref.ref(a)
test_fn(a)
del a
return wr() is not None
def test1(a):
tmp = a.descr
tmp += object()
def test2(a):
a.descr += object()
print(is_leaky(test1)) # gives False
print(is_leaky(test2)) # gives True!!!
どちらの場合も同じように動作すると予想されるため、これは私には非常に奇妙に思えます。さらに、参照カウントとオブジェクトの有効期間に関する私の理解から、どちらの場合もオブジェクトを解放する必要があると確信しました。
python2.7 と python3.3 の両方でテストしました。
これはバグですか、それとも意図的な動作ですか? 両方の呼び出しで期待どおりの結果が得られるようにする方法はありますか (問題のオブジェクトを解放します)。
weakref
inを使用したくないのはproxy
、バインドされたメソッドの正しいオブジェクト ライフタイム セマンティクスが破壊されるためです。
a = A()
descr = a.descr
del a # a is kept alive since descr is a bound method to a
descr() # should execute a.descr() as expected