2016-11-04 12 views
0

このテストでは、 "RuntimeError:Pythonオブジェクトを呼び出す際に最大再帰深度を超えました"というエラーメッセージが表示されます。 300番目のテストでは、 "sys.setrecursionlimit(10000)"を試してみましたが、問題を修正しましたが、これがこのエラーについての最良の方法ではないことを知っています。エラー:runtimeerror:最大再帰の深さがPythonを超えました

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

'self.SndRcv'は' self.processResponse'を呼び出し、 'self.processResponse'は' self.SndRcv'を呼び出します。なぜそれが任意の深度再帰につながるのか分かりますか? –

+0

再帰を理解するには、再帰を理解する必要があります。 – moooeeeep

+1

ビットを拡張する: '' 'SndRcv'''は返されず、' 'processResponse'''はciMsgTypeがNone''''の場合のみ' ''を返します。 – wwii

答えて

0

本質的に反復プロセスをコーディングするために再帰を使用しました。あなたは実際に大きな問題を小さな問題に還元するわけではありません。あなたは一連の入力を踏んでいます。入力を処理してレスポンスを報告すると、となります。呼び出しスタック上にコンテキストを保持する理由はありません。最終テストに合格し、1000回以上通話しても、結果や機能状態は何もせずにメインプログラムに戻ります。

これを簡単な繰り返しとして書き直します。どうやって始めますか?ある試験から別の試験にどのように進歩しますか?あなたはいつ終わったのですか?

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

んあなたが移動を取得こと:例えば、それはあなたの最も外側のループは、単純なながらに左右されることは非常に可能性は?

+0

私はそれが開始セッション私はここのコードには含まれていませんでした。基本的には、SndRcvを使ってセッションを開始するコマンドをテストツールに送信し、レスポンスのタイプに応じてresp = device_api.receive()から取得します。これをprocessResponse(resp)に渡して、次のステップを分析します私はprocessResponse(resp)を呼び出していないように何とかrefractorする必要があります... – Mahs

+0

ファイン。基本的な原則は同じです。上のループはあるテストから次のテストに移動します。サブルーチンで応答を分析しても、その情報を次の反復のために上位ループに戻すことができます。 – Prune

関連する問題