首页 > 解决方案 > 忽略语句体?

问题描述

class Test:
    def __init__(self):
        pass

    def __enter__(self):
        pass

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass


with Test():
    print (1) # any way to ignore it?

有没有办法忽略(不执行)with语句体?

也就是说,在这种情况下,我不想print (1)被执行(但我不想将此表达式包装在函数中,等等)

我需要这个用于一个个人实验项目。

尝试了一些选项,例如抛出异常,但它似乎不起作用。

PS:我不能将withbody 包裹在任何结构中(至少在调用 Test 类之前)。我想在 Test 类中实现这一点,例如,当调用一个类时,一些monkeypatch 可能会起作用等等。

PS2:忽略 with body 后程序应该仍然可以工作

标签: python

解决方案


from contextlib import suppress

class Pass(Exception):
    ...

class _skip:
    def __enter__(self):
        raise Pass

    def __exit__(self, exc_type, exc_val, exc_tb):
        pass

suppress = suppress(Pass)
skip = _skip()

with suppress, skip:
    print('ABC')
    raise SyntaxError
    print('XYZ')

print('Hello World')

您可能不with suppress, skip:完全喜欢这种语法,但我非常相信它们可以被包装到一个管理器中,只是我懒得去做,这似乎已经足够好了。


推荐阅读