如何将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
相关产品推荐
相关产品推荐

