python assert: 自动生成错误信息,,用过python a


用过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 = expr24         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]))

python assert: 自动生成错误信息

相关内容

    暂无相关文章

评论关闭