2

例如,我有这个代码:

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并且在退出相应的块y后都应该取消初始化。也不是. with_xyMyClass

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

如何确定__exit__刚刚退出的块以及返回的值是什么__enter__

(NB 代码应该是线程安全的)。


例子:

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"
4

1 回答 1

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
于 2012-11-26T12:57:13.973 回答