我一直得到这个错误RuntimeError:最大递归深度超过,而调用一个Python对象时,我尝试运行我的主机程序的智能卡测试工具与600测试,我得到这个错误后,第300次测试,我尝试sys. setpostsionlimited(10000),这解决了问题,但我知道,这不是最好的方式去处理这个错误,我怎么能改变我的代码,这样我就不会遇到这个错误:
def SndRcv(self,request):
print ">> ", request
device_api.send(request)
resp = device_api.receive()
print "<< ", resp
self.processResponse(resp)
def processResponse(self, K400Message):
global mWaitingCardRemoval
ciMsg = card_interface_response
ciMsgType = card_interface_response.ci_msg
if ciMsgType is None:
print 'weird, malformed protobuf response'
return
whichMsg = ciMsgType.WhichOneof('msg')
print 'msg = ' + str(whichMsg)
if whichMsg is 'collision':
self.StartSession()
elif whichMsg is 'card_removed':
if ciMsgType.issuer== ci.CARD_INTERFACE_MASK_CxLESS:
mWaitingCardRemoval &= ~(ciMsgType.issuer)
if EndofSession is False:
self.parseMessage()
if mWaitingCardRemoval !=0:
self.parseMessage()
self.StartSession()
elif whichMsg is 'waiting_removal':
if EndofSession is False:
self.parseMessage()
else:
mWaitingCardRemoval |= ciMsgType.issuer
elif whichMsg is 'card_detected':
mode = ciMsgType.issuer
reqMsg = pm.get_Deactivate((ci.CARD_INTERFACE_MASK_ANY)& ~(ciMsgType.issuer))
self.SendOnly(reqMsg)
acceptMsg = pm.get_Activate(mode)
self.SndRcv(acceptMsg)
elif whichMsg is 'card_ready':
self.StartLoop(ciMsgType.issuer)
elif whichMsg is 'rapdu':
self.processCardAPDUResponse(ciMsgType.issuer, ciMsg.data.encode('hex'))
elif whichMsg is 'card_not_responding':
if ciMsgType.issuer == ci.CARD_INTERFACE_MASK_CONTACT:
self.EndCardSession(ciMsgType.issuer,True)
else:
self.EndCardSession(ciMsgType.issuer, False)
elif whichMsg is 'resp_special':
if ciMsg.data.encode('hex') > 0:
logging.info(ciMsg.data.encode('hex'))
else:
logging.info("")
您使用递归来编写一个固有的迭代过程。您实际上并没有将一个大问题简化为一个较小的问题;您正在逐步执行一系列输入。一旦您处理输入并报告响应,您就完成了它。没有理由将其上下文保留在调用堆栈上。当您进行最终测试并通过数千次调用返回时,您对结果或函数状态不做任何操作以返回主程序。
将其重写为一个简单的迭代。你如何开始?你如何从一个测试进展到另一个测试?你如何知道你什么时候完成了?例如,你最外层的循环很可能取决于一个简单的时间:
# Get first response
while ciMsgType is not None:
# Process this response
# Get next response
这能让你动起来吗?