2024-09-29 23:30:51 发布
网友
我有这样的代码:
with SomeContext(args): <statement1> . . <statementN>
我希望这段代码表现得像这样:
else块中的语句也需要访问参数。在
但我想对这个抽象的用户隐藏f1和{},所以使用if-else块是不可能的。另外,我不想强制用户在函数中包装所有语句。是否可以在with上下文中执行一些python魔术来实现这一点?在
f1
with
是的,您可以很容易地创建这样一个上下文管理器,如下所示。在
import contextlib @contextlib.contextmanager def SomeContext(args): if some_condition(args): f1() else: yield
用户的包装代码在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管理器引发的{},在{}的情况下。在
SkipContext
SomeContext
请注意,多个上下文表达式的语法仅在Python2.7或更高版本中受支持。在早期版本中,您必须编写:
尽管文档中有声明,contextlib.nested上下文管理器与上面嵌套的with语句的语义不完全匹配,当从__enter__中抛出异常时,它不起作用。在
contextlib.nested
__enter__
需要注意的是,PEP 343提到了隐藏流控制的宏(如上下文管理器)和引用Raymond Chen's rant against hidden flow control是不可取的。在
是的,您可以很容易地创建这样一个上下文管理器,如下所示。在
用户的包装代码在
yield
处执行。我不认为上下文管理器有时不执行用户代码是个问题,但我没有检查过。在我能得到的最接近的方法是使用两个嵌套的上下文管理器,如下所示:
SkipContext
管理器实质上捕捉由内部SomeContext
管理器引发的{请注意,多个上下文表达式的语法仅在Python2.7或更高版本中受支持。在早期版本中,您必须编写:
^{pr2}$尽管文档中有声明,
contextlib.nested
上下文管理器与上面嵌套的with
语句的语义不完全匹配,当从__enter__
中抛出异常时,它不起作用。在需要注意的是,PEP 343提到了隐藏流控制的宏(如上下文管理器)和引用Raymond Chen's rant against hidden flow control是不可取的。在
相关问题 更多 >
编程相关推荐