例如,我有这段代码:
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
都应该取消初始化。 x
和y
也不是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"
答案 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