2015-12-21 3 views
0

я встретил проблему рассол, код является то, что:не солить instancemethod объекты

import cPickle 

class A(object): 

    def __init__(self): 
     self.a = 1 

    def methoda(self): 
     print(self.a) 


class B(object): 

    def __init__(self): 
     self.b = 2 
     a = A() 
     self.b_a = a.methoda 

    def methodb(self): 
     print(self.b) 
if __name__ == '__main__': 
    b = B() 
    with open('best_model1.pkl', 'w') as f: 
     cPickle.dump(b, f) 

Ошибка в том, что:

File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex raise TypeError, "can't pickle %s objects" % base.name TypeError: can't pickle instancemethod objects

ответ

1

Вы можете, если вы используете dill вместо cPickle.

>>> import dill  
>>> 
>>> class A(object): 
... def __init__(self): 
...  self.a = 1 
... def methods(self): 
...  print(self.a) 
... 
>>> 
>>> class B(object): 
... def __init__(self): 
...  self.b = 2 
...  a = A() 
...  self.b_a = a.methods 
... def methodb(self): 
...  print(self.b) 
... 
>>> b = B() 
>>> b_ = dill.dumps(b) 
>>> _b = dill.loads(b_) 
>>> _b.methodb() 
2 
>>> 

Также смотрите: Can't pickle <type 'instancemethod'> when using python's multiprocessing Pool.map()

+0

Есть Отер способ решить эту проблему вместо замены – DemoRunner

+0

Если вы посмотрите на то, что 'dill' делает, это только регистрирующие функции сериализации с' copyreg'. Если вы хотите, вы можете сделать то же самое ... в основном, зарегистрируйте те же функции сериализации 'dill', а затем' pickle' будет работать для вас, как указано выше. –

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