【发布时间】:2014-01-21 02:38:23
【问题描述】:
如果代码对象引发异常(可能多次,可能有延迟),我想在 exit() 方法中再次调用代码对象。我知道使用装饰器很容易做到,但我的动机是有时我只想重复一些我不想提取到单独函数并装饰它的代码片段。我正在寻找类似的东西:
class again(object):
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
???? # Invoke the code object again
return True # eat exception
它会像这样使用:
x = 0
with again():
print x
x += 1
if x == 1:
raise Exception('I hate 1')
预期的输出是:
0
1
我可以找到一种方法来获取代码对象。上下文管理器属性似乎都没有引用它(我猜它并不是真正需要的,因为它的工作只是在前后做一些事情)。
有可能吗?
【问题讨论】:
-
“代码对象”是什么意思?
-
我非常怀疑这是可能的——主要是因为这不是上下文管理器的用途。正如您所提到的,python 处理此问题的方式是通过函数(可能使用装饰器)。你所描述的对我来说更像红宝石......
-
上下文管理器用于管理资源。它们从未被设计为“块装饰器”来对代码块的功能进行任意更改,这正是您所寻找的。span>
标签: python contextmanager