我尝试使用上下文管理器在我的函数的finally:
部分中拥有所有清理代码。
- 清理的一个目标是确保对类
initialize_stuff()
的所有引用都设置为None。 - 使用下面的代码,在 的末尾仍然有一个对
- 我可以"强制";将变量设置为None,但是当我使用上下文管理器时,我可能会忘记它,我希望上下文管理器能做到这一点。
initialize_stuff()
的有效引用。这可能吗?如何?
指出:
- 使用
__enter__()
和__exit__()
有相同的问题 - 我想解决的完整问题(这里是简化版):如果我使用"with", Excel不会'关键字而不是"inline"python
import contextlib
import gc
class initialize_stuff(object):
def use(self):
pass
@contextlib.contextmanager
def do_things():
try:
release_me = initialize_stuff()
yield release_me
finally:
release_me = None
gc.collect()
with do_things() as release_me:
release_me.use()
# release_me = None
if release_me is not None:
print("release_me is not released")
else:
print("yeah")
我找到了一个答案,不确定它是否"干净";一:我在调用和目标类之间使用一个对象。这样,只有中间的对象保持"真实"。在上下文管理器中,它可以设置为None。
新增:send_to_class
import contextlib
import gc
class send_to_class(object):
def __init__(self, item):
self.item = item
def __getattr__(self, attr): # récupère les appels sur des méthodes non connues
return getattr(self.item, attr)
class initialize_stuff(object):
def use(self):
pass
@contextlib.contextmanager
def do_things():
try:
release_me = send_to_class(initialize_stuff())
yield release_me
finally:
release_me.item = None
gc.collect()
with do_things() as release_me:
release_me.use()
if release_me is not None:
print("release_me is not released")
else:
print("yeah")