3
我想在出口()方法中再次调用代码对象,如果它引发异常(可能是几次,也许有延迟)。我知道使用装饰器很容易,但我的动机是有时我想重复一些我不想提取到单独函数并对其进行装饰的代码段。我在找东西沿着这些路线:是否可以在上下文管理器的__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
我能找到一种方法,获取代码对象。上下文管理器属性似乎没有引用它(我想这不是真的需要,因为它的工作只是前后做的东西)。
是否可以做到这一点?
'code object'是什么意思? –
我非常怀疑这是可能的 - 主要是因为这不是上下文管理者的目的。正如你所暗示的,python的处理方式是通过函数(可能使用装饰器)。你所描述的气味更像是红宝石给我...... – mgilson
上下文管理器用于管理资源。他们从来没有被设计成“块装饰器”来任意改变代码块的功能,这正是你所期待的。 – user2357112