我需要在对象的方法上而不是对象本身上使用“ with”。
这是我已经尝试过的:
class LSTM:
...
def run(self):
def __enter__(self):
do something
return self
def __exit__(self, type, value, tb):
return self
我想在main中使用该功能的示例:
lstm = LSTM(...)
with lstm.run():
...
我得到的错误:
AttributeError: __enter__
答案 0 :(得分:3)
由您的方法返回的对象 必须是上下文管理器。将您的方法编写为生成器,并应用contextlib.contextmanager
decorator自动创建正确的帮助程序对象:
from contextlib import contextmanager
class LSTM:
@contextmanager
def run(self):
# prepare
yield self
# clean up
由装饰器创建的对象将yield
之前的任何内容用作__enter__
,并将其之后的任何内容用作__exit__
。 yield
提供的任何内容都可以在with语句的as
子句中使用。如果错误终止了上下文,则会在yield
处引发该错误。
答案 1 :(得分:1)
写时:
with soemthing:
然后,对象soemthing
需要具有那些__enter__
和__exit__
方法。
因此:
with lstm.run():
由lstm.run()
返回的对象需要具有__enter__
和__exit__
方法-lstm
具有这些方法的事实并不重要。
您应该做什么取决于您要实现的目标。但这:
with lstm:
将调用您定义的__enter__
和__exit__
方法。
答案 2 :(得分:0)
您的lstm.run()
语句的上下文表达式with
的计算结果不是context manager,而是None
,因为您的{中没有return
语句{1}}方法。
阅读:https://docs.python.org/3/reference/compound_stmts.html#the-with-statement