正しいですか。これはtwisted.python.rebuild
の制限です。既存のインスタンスとインポートされた関数とクラスの属性を更新しています(__class__
)。
これに対処する方法の1つは、submit a patch to Twistedにこの場合のrebuild
を修正することです。
ただし、Sensitive
をその目的に使用する場合は、コールバック保持クラスを実装して、Twistedの現在のバージョンでrebuild
と連携させることもできます。次の例は、関連するクラスの3つのメソッドをすべて使用して、関数を指すコールバックの辞書を更新する方法を示しています。 if needRebuildUpdate...
テストがなくても、x()
を直接呼び出すと、常に最新のバージョンが取得されます。
from twisted.python.rebuild import rebuild, Sensitive
from twisted.python.filepath import FilePath
p = FilePath("mymodule.py")
def clearcache():
bytecode = p.sibling("mymodule.pyc")
if bytecode.exists():
bytecode.remove()
clearcache()
p.setContent("def x(): return 1")
import mymodule
from mymodule import x
p.setContent("def x(): return 2")
class Something(Sensitive, object):
def __init__(self):
self.stuff = {"something": x}
def invoke(self):
if self.needRebuildUpdate():
for key in list(self.stuff):
self.stuff[key] = self.latestVersionOf(self.stuff[key])
self.rebuildUpToDate()
return self.stuff["something"]()
def test():
print s.invoke()
print x()
s = Something()
test()
clearcache()
rebuild(mymodule)
test()