zoukankan      html  css  js  c++  java
  • python assert: 自动生成错误信息

    用过python assert的朋友应该会经常碰到这样的疑惑,如:

        (a,b) = (1,'1')

         assert a==b     # error: AssertionError

    在代码调试的时候,很难直观的看出为什么错了,除非写成这样:

        assert 1=='1',  "fact==expect, [fact]=%s, [expect]=%s" % ([a],[b])    # AssertionError: fact==expect, [fact]=[1], [expect]=['1']

    但是这样每次都要去写错误信息,用得频繁了会有些繁琐,本文介绍一种【动态断言】的机制,形如:

       assertx('1', "==", 1)   # (%s['f'] == %s['e']), [fact]=['1'], [expe]=[1]

    代码如下:

     1 #encoding=utf-8
     2 def assertx(fact, expr, expe):
     3     """ #原有的assert看不到表达式内部、且无法自动生成错误信息
     4 if __name__=='__main__':
     5     assertx(1, "!=", 2)
     6     assertx(1, "%s['f'] in %s['e']", [1,11])
     7     assertx([1,100], "%s['e'] in %s['f']", 100)
     8     try:
     9         assertx('1', "==", 1)
    10     except StandardError,e:
    11         print e   # (%s['f'] == %s['e']), [fact]=['1'], [expe]=[1]
    12     
    13     try:
    14         assertx('1', "not in", ['1'])
    15     except StandardError,e:
    16         print e  # when typeSimple, assert: expr.find(' ')==-1, [expr]=['not in']
    17     """
    18     fDc = {'f':fact}
    19     eDc = {'e':expe}
    20     atFact = expr.find("%s['f']")
    21     atExpe = expr.find("%s['e']")
    22     if (atFact>-1 and atExpe>-1):       #【type=Custom】
    23         exprStr = expr
    24         if atFact < atExpe:
    25             exprFormat = expr%(fDc,eDc)
    26         else:
    27             exprFormat = expr%(eDc,fDc)
    28     else:                               #【type=Simple】
    29         assert expr.find(' ')==-1, 
    30                 "when typeSimple, assert: expr.find(' ')==-1, [expr]=%s"%[expr]
    31         exprStr = "(%%s['f'] %s %%s['e'])" % expr   # exam: '(%s['f'] == %s['e'])'
    32         exprFormat = exprStr%(fDc,eDc)            # exam: '("factValue" == "expeValue")'
    33     if not eval(exprFormat):   # exam: "'%s' == '%s'"
    34         raise StandardError("""%s, [fact]=%s, [expe]=%s"""%(exprStr,[fact],[expe]))
    【@JayveeYao】
  • 相关阅读:
    NEON中的L可以避免溢出
    编译Qualcomm的Hexagon exampls错误
    C语言中的static
    在非NDK编译条件下使用Android Log函数
    NEON的vsub方法溢出
    OpenCL中读取image时的坐标
    Ubuntu16.0 GTX1660Ti 安装NVIDIA CUDA cuDNN Tensflow
    修改so库中的依赖名
    Qt数据库总结
    Qt插件系统
  • 原文地址:https://www.cnblogs.com/JayveeYao/p/5244874.html
Copyright © 2011-2022 走看看