2014-12-14 2 views
1

Здесь у меня есть определение этого класса class definition. Когда я запускаю код ниже, он вызывает следующие ошибки.Невозможно рассортировать экземпляр класса Python

sm = SaliencyMaskSlic() 
operations = [('img_resize', img_resize), ('sal_mask', sm.transform)] 
args_list = [{'h_size':258}, {'cropped':True}] 

pre_pipeline = Pipeline(ops=operations, arg_list=args_list) 
ch = ColorHist('RGB', [6,6,6], [2,2], center=True, pre_pipeline = pre_pipeline) 

dill.dump(ch, open('erogol.pkl','wb')) 
... 
dill.loads('erogol.pkl') 


--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-11-c8a5937780b5> in <module>() 
----> 1 dill.loads('erogol.pkl') 

/usr/local/lib/python2.7/dist-packages/dill/dill.pyc in loads(str) 
    158  """unpickle an object from a string""" 
    159  file = StringIO(str) 
--> 160  return load(file) 
    161 
    162 # def dumpzs(obj, protocol=None): 

/usr/local/lib/python2.7/dist-packages/dill/dill.pyc in load(file) 
    148  pik = Unpickler(file) 
    149  pik._main_module = _main_module 
--> 150  obj = pik.load() 
    151  if type(obj).__module__ == _main_module.__name__: # point obj class to main 
    152   try: obj.__class__ == getattr(pik._main_module, type(obj).__name__) 

/usr/lib/python2.7/pickle.pyc in load(self) 
    856    while 1: 
    857     key = read(1) 
--> 858     dispatch[key](self) 
    859   except _Stop, stopinst: 
    860    return stopinst.value 

/usr/lib/python2.7/pickle.pyc in load_appends(self) 
    1185  def load_appends(self): 
    1186   stack = self.stack 
-> 1187   mark = self.marker() 
    1188   list = stack[mark - 1] 
    1189   list.extend(stack[mark + 1:]) 

/usr/lib/python2.7/pickle.pyc in marker(self) 
    872   mark = self.mark 
    873   k = len(stack)-1 
--> 874   while stack[k] is not mark: k = k-1 
    875   return k 
    876 

IndexError: list index out of range 

В принципе, у меня есть экземпляр класса с использованием другого экземпляра класса внутри. Я также использовал cPickle, но он поднимается, когда я сбрасываю;

TypeError: can't pickle instancemethod objects 

Любая идея для решения?

+0

Возможный дубликат: http://stackoverflow.com/questions/6583326/is-this-the-right-way-to-pickle-instance-methods-if-yes-why-isnt-it-in -python и http://stackoverflow.com/questions/5429584/handling-the-classmethod-pickling-issue-with-copy-reg?rq=1 – User

+3

@User: это не дублирующий вопрос. Что касается ошибки, 'dill' не должен бросать' IndexError' в любом месте. Я думаю, что единственная причина, связанная с травлением, может привести к тому, что у вас есть динамически добавленный атрибут, который не сохраняется при травлении. В общем случае один экземпляр класса с использованием другого не должен быть проблемой. Тем не менее, определение класса, на которое вы ссылаетесь, велико и использует другие файлы в вашем репозитории, и, следовательно, делает его менее вероятным для людей, чтобы травить его и попробовать. Вы можете продемонстрировать свою проблему с меньшим размером кода? –

ответ

1

Это не ошибка травления. Вы не можете сортировать экземпляры классов с pickle или cPickle, но вы можете с dill. У вашего кода есть ошибка где-то, что дает вам IndexError.

Также лучше, чем класс, имеющий dump и load метод, вы можете просто использовать dump и load из dill непосредственно ... затем, если вы делаете что-то сложное, вы можете добавить __getstate__ и __setstate__ метод.

Кроме того, ваша загрузка из маринованного файла имеет ошибку. Вы делаете это:

self = dill.loads(in_path) 

В то время как вы должны (1) использовать dill.load вместо этого, и (2) нагрузка _self, а затем заменить соответствующее состояние.

_self = dill.load(in_path) 
    self.nbins = _self.nbins 
    self.mask = _self.mask 
    # and so on... (or update all at once using `__dict__`) 
Смежные вопросы