使用 "with" 将"无"设置为"无"



我尝试使用上下文管理器在我的函数的finally:部分中拥有所有清理代码。

  • 清理的一个目标是确保对类initialize_stuff()的所有引用都设置为None。
  • 使用下面的代码,在
  • 的末尾仍然有一个对initialize_stuff()的有效引用。
  • 我可以"强制";将变量设置为None,但是当我使用上下文管理器时,我可能会忘记它,我希望上下文管理器能做到这一点。

这可能吗?如何?

指出:

  • 使用__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")

相关内容

最新更新