首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现类C断言

实现类C断言
EN

Stack Overflow用户
提问于 2013-05-26 16:48:15
回答 3查看 244关注 0票数 1

我正在尝试实现一个断言函数。如何将失败条件的文本添加到错误消息中?如果我必须从回溯中解析它,我可以依赖任何关于帧格式的东西吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-26 23:04:54

如果你确定要测试的表达式是安全的,你可以这样做:

文件my_assert.py:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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()

输出:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-05-26 17:05:23

AssertionError就像python中的任何其他异常一样,而assert是一个简单的语句,等同于

代码语言:javascript
运行
复制
if __debug__:
    if not expression: raise AssertionError

代码语言:javascript
运行
复制
if __debug__:
    if not expression1: raise AssertionError(expression2)

因此,您可以在断言中添加第二个参数,以获得额外的输出

代码语言:javascript
运行
复制
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())

输出

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AssertionError: assert was false
票数 3
EN

Stack Overflow用户

发布于 2013-05-26 16:51:38

我的非常黑客的解决方案:

代码语言:javascript
运行
复制
def my_assert(condition):
    if not eval(condition):
        # error stuff

然后通过将条件放在引号中来使用它。然后它就是一个可以在错误消息中打印的字符串。

或者,如果您希望它实际引发一个AssertionError

代码语言:javascript
运行
复制
def my_assert(condition):
    if not eval(condition):
        raise AssertionError(condition)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16757623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档