在__exit__中由__enter__返回

时间:2012-11-26 12:51:53

标签: python

例如,我有这段代码:

with MyClass() as x:
    print 'I have only {0}'.format(x)
    with MyClass() as y:
        print 'I have {0} and {1}'.format(x, y)
    print 'Again only {0}'.format(x)
退出相应的x块后,

ywith都应该取消初始化。 xy也不是MyClass的实例。

__exit__只有三个参数,每个参数都是None(如果没有提供异常)。

如何在__exit__确定刚刚退出哪个区块以及__enter__返回了什么值?

(N.B。代码应该是线程安全的)。


示例:

class MyClass(object):
    def __enter__(self):
        if moon_phase > 0:
            return 123
        else:
            return 456
    def __exit__(self):
        number = what_was_returned_by_enter()
        print 'End of block with', number


 with MyClass() as x:
    print x  # 123
    with MyClass() as y:
        print x, 'and', y  # 123 and 456
    # printed "End of block with 456"
    print x  # 123
 # printed "End of block with 123"

1 个答案:

答案 0 :(得分:3)

由于您有一个处理上下文的自定义类,self将成为上下文管理器实例。

您需要检查其状态(在__init__()创建时或存储__enter__()时存储)以确定您刚刚退出的状态。

以下示例将__enter__的返回值存储在实例上,以便在调用__exit__时再次检索它:

class MyClass(object):
    def __enter__(self):
        if moon_phase > 0:
            self.returnval = 123
        else:
            self.returnval = 456
        return self.returnval

    def __exit__(self, *args):
        number = self.returnval
        print 'End of block with', number