有条件地跳过Python With语句的主体

2024-10-04 05:33:44 发布

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

我有一个With语句,如果某个<condition>满足,我想跳过它。就是我写,

With MyContext() as mc:
  do_something()

class MyContext(object):
...
def __enter__(self,...):
  if <condition>:
    JumpToExit()
def __exit__(self,...):
  print('goodbye')

我希望do_something()只在某些条件下执行,否则我希望JumpToExit()完全跳过主体,只完成块

谢谢


Tags: selfifobjectdefaswith语句mc
3条回答

我不确定这是否可能__enter__是在with语句引入的try块之外执行的,因此我看不到直接从__enter__跳到__exit__的方法

with基本上(简化)是这样的:

with context as x:
    do_something()

进入

x = context.__enter__()
try:
    do_something()
finally:
    context.__exit__()

您需要在do_something()中抛出一个异常,或者成功完成它以进入__exit__。如果您确实从do_something()抛出异常,您可以在退出函数中(使用传递给它的一些参数)抑制异常,这样您就看不到它了。但是它必须是with块中的代码,它以某种方式导致跳转到__exit__

也许,如果您可以通过在__enter__中设置一些值来确保do_something立即抛出异常,那么您就可以使它正常工作。但对我来说,这听起来不是个好主意

您可以将with语句放入函数中并使用return:

def foo():
    With MyContext() as mc:
        if <condition>:
            return None
        do_something()

这是不可能的。with语句无法取消该块。但是,您可以这样做:

def __enter__(self):
    return condition

然后,当您使用上下文时:

with context as condition:
    if condition:
        ....

如果您还想返回其他内容,您可以返回类似return condition, self的元组,然后使用它,您可以解压缩类似with condition, context:的元组

相关问题 更多 >