我正在尝试实现一个断言函数。如何将失败条件的文本添加到错误消息中?如果我必须从回溯中解析它,我可以依赖任何关于帧格式的东西吗?
发布于 2013-05-26 23:04:54
如果你确定要测试的表达式是安全的,你可以这样做:
文件my_assert.py:
import sys
def my_assert(condition):
caller = sys._getframe(1)
if not eval(condition, caller.f_globals, caller.f_locals):
raise AssertionError(repr(condition) + " on line " +
str(caller.f_lineno) + ' in ' +
caller.f_code.co_name)文件test_my_assert.py:
from my_assert import my_assert
global_var = 42
def test():
local_var = 17
my_assert('local_var*2 < global_var') # OK
my_assert('local_var > global_var')
test()输出:
Traceback (most recent call last):
File "test_my_assert.py", line 10, in <module>
test()
File "test_my_assert.py", line 8, in test
my_assert('local_var > global_var')
File "my_assert.py", line 8, in my_assert
caller.f_code.co_name)
AssertionError: 'local_var > global_var' on line 8 in test发布于 2013-05-26 17:05:23
AssertionError就像python中的任何其他异常一样,而assert是一个简单的语句,等同于
if __debug__:
if not expression: raise AssertionError或
if __debug__:
if not expression1: raise AssertionError(expression2)因此,您可以在断言中添加第二个参数,以获得额外的输出
from sys import exc_info
from traceback import print_exception
# assertions are simply exceptions in Python
try:
assert False, "assert was false"
except AssertionError:
print_exception(*exc_info())输出
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AssertionError: assert was false发布于 2013-05-26 16:51:38
我的非常黑客的解决方案:
def my_assert(condition):
if not eval(condition):
# error stuff然后通过将条件放在引号中来使用它。然后它就是一个可以在错误消息中打印的字符串。
或者,如果您希望它实际引发一个AssertionError
def my_assert(condition):
if not eval(condition):
raise AssertionError(condition)https://stackoverflow.com/questions/16757623
复制相似问题