由 __exit__ 中的 __enter__ 返回

2024-02-23

例如,我有这样的代码:

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 and y两者都应该在相应的退出后取消初始化with块。还x and y不是以下实例MyClass.

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

我怎样才能确定__exit__哪个块刚刚退出以及返回了什么值__enter__?

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


Example:

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"

由于您有一个处理上下文的自定义类,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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由 __exit__ 中的 __enter__ 返回 的相关文章

随机推荐