2016-10-07 3 views
0

У меня есть namedtuple внутри класса. При травлении с использованием укропа, он жалуется на классическую проблему неспособности найти объект namedtuple в верхнем модуле.Python dill: 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 

Я не уверен, если есть какой-нибудь выход. Else придется прокладывать путь по пути только до nit - выберите dataframes для маринования, что я ненавижу делать.

Любая помощь очень ценится.

+0

Привет, я автор 'dill'. Я думаю, что проблема может быть такой: https://github.com/uqfoundation/dill/issues/132. С 'dill',' namedtuple' рассолки довольно хорошо, если он не называется «плохо». В принципе, если вы назовете его, как показано в приведенной выше проблеме, используйте ссылку указателя для того, что вы хотите, что может просто «работать». Ключ имеет нулевой аргумент так же, как '__name__'. –

+0

@MikeMcKerns благодарит за ответ. Я не уверен - у меня нет «плохого» наименования. я попробовал - TM = namedtuple ('ТМ', tmeas_fields) ТМ .__ name__ = "ТМ" печати ТМ выход: <класс '__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_, как и мой предыдущий комментарий, я пробовал точно то, что вы предложили здесь, то есть не make _namedtuple_ как атрибут. Но я все равно получаю такую ​​же ошибку. На альтернативном предположении, если я буду использовать say_self.TM_ и поставьте _reduce_(). Не уверен, что у меня есть это правильно, но все равно получаю ошибку smae. def __reduce __ (self): возвращение (сам .__ класс__, (сам.TM, сам.PM, сам.SPOSX, self.CFH)) – rrkarts

+0

Хм, это поможет увидеть полную сокращенную версию вашего кода, тогда - тот, который все еще производит ошибку ... потому что моя версия выше работает, пока вы не используете 'self.TM'. –

Смежные вопросы