2014-07-23 70 views
1

我在返回我在report函數內部構建的字典時遇到了一些麻煩。我知道我實際上調用了decode函數。我無法弄清楚如何解決這個問題。一切正常。代碼做它應該做的。但後來,我加入這本字典,我想回國,所以我可以在script_A.py返回詞典

調用代碼中使用它(sript_A.py):

self.decoder = Decoder(Frame) 
recvDict = self.decoder.decode(self.message) 
print type(recvDict) # this returns <type 'NoneType'> 

調用代碼(script_B.py):

class Decoder(object): 
    def decode(self, message): 
     processIncomingPacket(message, self.report) 

    def report(self, message): 
     my_dict = {'a': '123', 'b': '456'} 
     return my_dict 

其中processIncomingPacket定義一些其他的腳本:

class Some_class(object): 
    processIncomingPacket(self, data, callback): 
     raise NotImplementedException("not implemented") 

更新:

的實施processIncomingPacket

def processIncomingPacket(self, data, callback): 
    _logger.debug(" ".join([hex(ord(x)) for x in data])) 
    self.addToFrame(data) 
    while self.isFrameReady(): 
     if self.checkFrame(): 
      result = self.decoder.decode(self.getFrame()) 
      if result is None: 
       raise PacketIOException("Unable to decode request") 
      self.populateResult(result) 
      self.advanceFrame() 
      callback(result) # defer or push to a thread? 
     else: break 
+3

它看起來像你需要做的:'返回processIncomingPacket(消息,self.report)''的功能decode'內。 – iCodez

+0

@iCodez我試過了,並且不起作用:( – gspt

+0

@vgo你可以分享'processIncomingPacket'的* actual *實現嗎?具體地說它執行'callback'的地方? – dano

回答

1

的問題是,processIncomingPacket不返回您傳遞給它回調的結果(self.result,你的情況):

self.populateResult(result) 
self.advanceFrame() 
callback(result) # Doesn't capture the return value 

最簡單的解決方法是調整你的回調是如何工作的,讓它不需要返回任何東西。相反,把它利用現有的字典對象並更新與內容你想要的:

from functools import partial 

class Decoder(object): 
    def decode(self, message, recvDict): 
     callback = partial(self.report, recvDict) 
     processIncomingPacket(message, callback) 

    def report(self, recvDict, message): 
     my_dict = {'a': '123', 'b': '456'} 
     recvDict.update(my_dict) 

self.decoder = Decoder(Frame) 
recvDict = {} 
self.decoder.decode(self.message, recvDict) 
# recvDict now matches my_dict 
+0

謝謝!我從來沒有聽說過functools。至少現在當我在'self.decoder.decode(self.message,recvDict)'行後面輸入type(recvDict)'時,它說它是一個字典,但是當我'PRI nt recvDict'顯示一個空的字典'{}'。任何想法爲什麼? – gspt

+0

@vgo對不起,我在'report'函數中顛倒了參數。現在應該是好的。 – dano

+0

現在效果很好!非常感謝! :d – gspt

1

的processIncomingPacket似乎什麼都不做,但引發異常。

class Some_class(object): 
    processIncomingPacket(self, data, callback): 
     raise NotImplementedException("not implemented") 

我相信你需要修復processIncomingPacket的實現來處理傳遞的參數並返回字典。