You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python断言转为警告并实现断言失败后继续执行?

让断言失败后继续执行并仅打印警告的简便方法

你可以通过自定义上下文管理器实现需求,不用给每个断言套try-except,直接在with块里保留原有断言写法即可,失败时只会打印警告而非终止程序。

实现自定义上下文管理器

import warnings
import contextlib

@contextlib.contextmanager
def assert_as_warnings():
    # 保存原内置断言函数
    original_assert = __builtins__.assert
    def custom_assert(expr, msg=None):
        if not expr:
            # 断言失败时输出警告
            warning_msg = msg or f"Assertion failed: {expr}"
            warnings.warn(warning_msg, UserWarning, stacklevel=2)
    # 临时替换内置断言
    __builtins__.assert = custom_assert
    try:
        yield
    finally:
        # 恢复原断言行为
        __builtins__.assert = original_assert

# 测试函数
def square(x):
    '''my sloppy implementation'''
    return 16

# 使用上下文管理器执行断言
with assert_as_warnings():
    assert square(2) == 4
    assert square(4) == 16
    assert square(-5) == 25

代码说明

  • 上下文管理器会临时替换Python内置的assert函数,断言失败时不抛出AssertionError,而是用warnings.warn()输出警告。
  • stacklevel=2能让警告信息直接指向你编写断言的代码行,而非上下文管理器内部代码,便于定位问题。
  • with块执行完毕后,会自动恢复原有的断言行为,不会影响其他代码逻辑。

运行效果

执行后会输出两条警告,所有断言都会执行,不会因第一个失败就终止:

UserWarning: Assertion failed: square(2) == 4
  warnings.warn(warning_msg, UserWarning, stacklevel=2)
UserWarning: Assertion failed: square(-5) == 25
  warnings.warn(warning_msg, UserWarning, stacklevel=2)

内容的提问来源于stack exchange,提问作者Jörn Hees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:01:14