2016-10-07 63 views
0

我在課堂裏有namedtuple。當使用蒔蘿進行酸洗時,它會抱怨無法在頂層模塊中找到指定的對象的經典問題。Python蒔蘿:Pickle namedtuple似乎不起作用

import dill as pickle  
class NNRTMParse(object): 

    def __init__(self,logfile)): 
     . 
     . 
     . 
     . 

     self.TM = namedtuple('TM',tmeas_fields) 
     #print self.TM 
     CFH = namedtuple('CFH',cfhdr_fields) 
     PM = namedtuple('PM',pmeas_fields2) 
     print PM 

這是self.TM和其他的默認賦值,我動態分配namedtuple當我解析日誌。

但酸洗:

if __name__ == "__main__": 

    filename = 'dbggen_rx_loc_2-llh_rtm_lla_out_20160929_130711_day2_4381_JN2_SN64_rtmproc_2M5M.txt' 
    N = NNRTMParse(filename) 
    N.parse() 
    N.get_rx_loc('oak484_bora-llh') 

    filehandler = open("NNRTMParse_JB2-SN052.obj","wb") 
    pickle.dump(N,filehandler) 
    filehandler.close() 






Traceback (most recent call last): 
    File "C:/NN_Hardware/spos_proc/NNRTMParse.py", line 937, in <module> 
    pickle.dump(N,filehandler) 
    File "C:\Python27\lib\site-packages\dill\dill.py", line 236, in dump 
    pik.dump(obj) 
    File "C:\Python27\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "C:\Python27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python27\lib\pickle.py", line 419, in save_reduce 
    save(state) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\site-packages\dill\dill.py", line 835, in save_module_dict 
    StockPickler.save_dict(pickler, obj) 
    File "C:\Python27\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems 
    save(v) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\site-packages\dill\dill.py", line 1189, in save_type 
    StockPickler.save_global(pickler, obj) 
    File "C:\Python27\lib\pickle.py", line 748, in save_global 
    (obj, module, name)) 
pickle.PicklingError: Can't pickle <class '__main__.TM'>: it's not found as __main__.TM 

我不知道是否有任何出路。否則就不得不通過路徑來挑選數據框來醃菜,我討厭這樣做。

任何幫助非常感謝。

+0

嗨,我是'蒔蘿'作者。我認爲這個問題可能是這樣的:https://github.com/uqfoundation/dill/issues/132。用'dill',一個'namedtuple'鹹菜很好,只要它沒有被命名爲「糟糕」。基本上,如果您按照上述問題的名稱命名,則可以使用指針參考來獲得您想要的內容,這可能只是「正常工作」。關鍵是第零個參數與__name__相同。 –

+0

@MikeMcKerns感謝您的回覆。我不確定 - 我沒有「壞」命名。 我試圖 - TM = namedtuple( 'TM',tmeas_fields) TM .__ name__ = 「TM」 打印TM 輸出: <類 '__main __ TM。'>。 pickle.PicklingError:Can not pickle :找不到__main__.TM – rrkarts

回答

0

問題是self.TMnamedtuple。如果你不使用namedtuple作爲類的屬性,那麼你的課應該泡菜。

# file: xxx.py 
from collections import namedtuple 

class NNRTMParse(object): 

    def __init__(self): 
    TM = namedtuple("TM", 'a') 
    CFH = namedtuple("CFH", 'b') 
    print CFH 

它應該是這樣的:

>>> from xxx import * 
>>> a = NNRTMParse() 
<class 'xxx.CFH'> 
>>> import dill 
>>> dill.copy(a) 
<xxx.NNRTMParse object at 0x107da3350> 

然而,一旦你嘗試使用namedtuple作爲一個屬性,它失敗,您所看到的錯誤。

我建議增加一個__reduce__方法(https://docs.python.org/3/library/pickle.html#object.reduce)告訴pickle如何序列化類實例的狀態。

+0

即使沒有_self.TM_,就像我以前的評論一樣,我已經嘗試過你在這裏提出的內容,即不是使_namedtuple_成爲一個屬性。但我仍然有同樣的錯誤。 關於你的替代建議,如果我會使用_self.TM_,並放置_reduce_()。不知道如果我有這個正確的,但仍然得到smae錯誤。 (自我.__ class__,(self.TM,self.PM,self.SPOSX,self.CFH)) – rrkarts

+0

嗯,它會幫助你看到你的代碼的完整縮減版本,然後 - 一個仍然會產生錯誤的東西......因爲我的版本在你使用'self.TM'之前是可行的。 –