相关疑难解决方法(0)

是否可以在上下文管理器的__exit __()方法中访问上下文对象(代码块)?

我想在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
Run Code Online (Sandbox Code Playgroud)

它会像这样使用:

x = 0
with again():
    print x
    x += 1
    if x == 1:
         raise Exception('I hate 1')
Run Code Online (Sandbox Code Playgroud)

而预期的产出将是:

0
1  
Run Code Online (Sandbox Code Playgroud)

我可以找到一种方法来获取代码对象.没有任何上下文管理器属性似乎引用它(我想这不是真正需要的,因为它的工作只是在前后做事).

有可能吗?

python contextmanager

3
推荐指数
1
解决办法
699
查看次数

标签 统计

contextmanager ×1

python ×1