当前位置:  开发笔记 > 编程语言 > 正文

Python断言 - 改进了对失败的反省?

如何解决《Python断言-改进了对失败的反省?》经验,为你挑选了3个好方法。

这是一个相当无用的断言错误; 它没有告诉所涉及的表达式的值(假设使用的常量实际上是变量名):

$ python -c "assert 6-(3*2)"
[...]
AssertionError

assert在Python中有更好的实现更加花哨吗?它不得在执行时引入额外的开销(断言失败时除外)..如果使用-Oflag,则必须关闭.

编辑:我知道assert的第二个参数是一个字符串.我不想写一个..因为它是在被断言的表达式中编码的.干(不要重复自己).



1> Alex Martell..:

安装您的函数sys.excepthook- 请参阅文档.如果第二个参数是AssertionError,你的功能可以反省你内心的内容; 特别是,通过第三个参数,回溯,它可以获得断言失败的帧和确切位置,通过源或字节码获得失败的异常,所有相关变量的值等等.模块检查有帮助.

完全一般地完成它是一项相当大的工作,但是根据你在编写asserts时你愿意接受的约束,它可以大大减轻(例如将它们限制为仅局部变量或全局变量使得内省比非本地变量更容易.可以涉及闭包的变量,等等.


好.现在有一个Python库吗?或者我必须自己编写?:-)(我可能不会......因为这对我来说是一个低prio的任务)

2> Greg Hewgill..:

您可以将消息附加到assert:

assert 6-(3*2), "always fails"

消息也可以动态构建:

assert x != 0, "x is not equal to zero (%d)" % x

有关更多信息,请参阅Python文档中的assert语句.



3> jfs..:

正如@Mark Rushakoff所说, nose可以评估失败的断言.它也适用于标准assert.

# test_error_reporting.py
def test():
    a,b,c = 6, 2, 3
    assert a - b*c

nosetests' 救命:

$ nosetests --help|grep -B2 assert
  -d, --detailed-errors, --failure-detail
                        Add detail to error output by attempting to evaluate
                        failed asserts [NOSE_DETAILED_ERRORS]

例:

$ nosetests -d
F
======================================================================
FAIL: test_error_reporting.test
----------------------------------------------------------------------
Traceback (most recent call last):
  File "..snip../site-packages/nose/case.py", line 183, in runTest
    self.test(*self.arg)
  File "..snip../test_error_reporting.py", line 3, in test
    assert a - b*c
AssertionError:
    6,2,3 = 6, 2, 3
>>  assert 6 - 2*3


----------------------------------------------------------------------
Ran 1 test in 0.089s

FAILED (failures=1)

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有