如何停止Python中上下文语句的执行?

2024-09-29 23:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的代码:

with SomeContext(args):
  <statement1>
  .
  .
  <statementN>

我希望这段代码表现得像这样:

^{pr2}$

else块中的语句也需要访问参数。在

但我想对这个抽象的用户隐藏f1和{},所以使用if-else块是不可能的。另外,我不想强制用户在函数中包装所有语句。是否可以在with上下文中执行一些python魔术来实现这一点?在


Tags: 函数代码用户参数ifwith魔术args
2条回答

是的,您可以很容易地创建这样一个上下文管理器,如下所示。在

import contextlib

@contextlib.contextmanager
def SomeContext(args):
    if some_condition(args):
        f1()
    else:
        yield

用户的包装代码在yield处执行。我不认为上下文管理器有时不执行用户代码是个问题,但我没有检查过。在

我能得到的最接近的方法是使用两个嵌套的上下文管理器,如下所示:

class SkippedException(Exception):
    pass

class SkipContext:
    def __enter__(self):
        pass
    def __exit__(self, type, value, tb):
        return type is SkippedException

class SomeContext:
    def __init__(self, arg):
        self.arg = arg
    def __enter__(self):
        if self.arg == 1:
            print "arg", self.arg
            raise SkippedException()
    def __exit__(self, type, value, tb):
        pass

with SkipContext(), SomeContext(1):
    print "body"

SkipContext管理器实质上捕捉由内部SomeContext管理器引发的{},在{}的情况下。在

请注意,多个上下文表达式的语法仅在Python2.7或更高版本中受支持。在早期版本中,您必须编写:

^{pr2}$

尽管文档中有声明,contextlib.nested上下文管理器与上面嵌套的with语句的语义不完全匹配,当从__enter__中抛出异常时,它不起作用。在

需要注意的是,PEP 343提到了隐藏流控制的宏(如上下文管理器)和引用Raymond Chen's rant against hidden flow control是不可取的。在

相关问题 更多 >

    热门问题