长话短说,如何让第二段代码与第一段完全相同?
当我需要的时候,那个设备肯定没有正确的设置:
stack_device = [None]
stack_context = [None]
@contextlib.contextmanager
def device(device):
stack_device.append(device)
try:
yield
finally:
stack_device.pop()
@contextlib.contextmanager
def context(ctx):
stack_context.append(ctx)
try:
with device("dev"):
yield
finally:
stack_context.pop()
with context("myctx"):
print(stack_device[-1]) # -> dev
print(stack_context[-1]) # -> ctx
当我需要的时候,那个设备肯定没有正确的设置:
stack_device = [None]
stack_context = [None]
class Device():
def __init__(self, device):
self.device = device
def __enter__(self):
stack_device.append(self.device)
return
def __exit__(self, type, value, traceback):
stack_device.pop()
class Context():
def __init__(self, ctx):
self.ctx = ctx
def __enter__(self):
with Device("cls_dvc"):
stack_context.append(self.ctx)
return
def __exit__(self, type, value, traceback):
stack_context.pop()
with Context("myctx"):
print(stack_device[-1]) # -> None !!!
print(stack_context[-1]) # -> myctx
在第二种情况下实现与第一种情况相同的行为的正确方法是什么?
__enter__
是一个私有成员,但测试表明它是公共的。 - Daniel Chin__enter__
是一个特殊的魔术方法,因此Python对其进行了特殊处理。与__foo
这样的属性不同,名称修饰(参见上面链接的文章)并不适用于它。请参阅Python数据模型以获取所有魔术方法和属性的列表。 - Jack Taylor