runtimeerror:最大递归深度超过python

2024-09-29 22:37:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直收到这样的错误“RuntimeError:maximum recursion depth exceeded when calling a Python object”当我尝试运行我的智能卡测试工具的主机程序进行600次测试后,我尝试了sys.setrecursionlimit这解决了这个问题,但我知道这不是最好的办法此错误,如何更改代码以避免遇到此错误:

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("")

Tags: selfciifisrequest错误cardresp
1条回答
网友
1楼 · 发布于 2024-09-29 22:37:58

您使用递归来编写固有的迭代过程。实际上,您并没有将一个大问题简化为一个较小的问题;您是在逐步处理一系列输入。一旦你处理了一个输入并报告了响应,你就完成了。没有理由把它的上下文保留在调用堆栈上。当您完成最后的测试并通过上千个调用返回时,您对结果或函数状态不做任何操作以返回主程序。在

将其重写为直接的迭代。你怎么开始的?从一个测试到另一个测试你是如何进步的?你怎么知道什么时候结束了?例如,您的最外层循环很可能会依赖于一个简单的

# Get first response
while ciMsgType is not None:
    # Process this response
    # Get next response

你动起来了吗?在

相关问题 更多 >

    热门问题