在类方法上使用“ with”语句

时间:2019-06-11 16:02:44

标签: python

我需要在对象的方法上而不是对象本身上使用“ 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__

3 个答案:

答案 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