Python: no se pueden encoger errores en los objetos del módulo

Estoy tratando de encurtir a una clase grande y obtengo “TypeError: no puedo encoger objetos del módulo”. A pesar de mirar alrededor de la web, no puedo entender exactamente lo que esto significa. y no estoy seguro de qué “objeto de módulo” está causando el problema. ¿Hay alguna manera de encontrar al culpable? El rastro de la stack no parece indicar nada.

Puedo reproducir el mensaje de error de esta manera:

import cPickle class Foo(object): def __init__(self): self.mod=cPickle foo=Foo() with file('/tmp/test.out', 'w') as f: cPickle.dump(foo, f) # TypeError: can't pickle module objects 

¿Tienes un atributo de clase que hace referencia a un módulo?

La incapacidad de Python para encurtir objetos del módulo es el verdadero problema. ¿Hay alguna buena razón? No lo creo. El hecho de que los objetos de los módulos no se puedan copiar contribuye a la fragilidad de Python como un lenguaje paralelo / asíncrono. Si quieres decapar objetos del módulo, o casi cualquier cosa en Python, entonces usa dill .

 Python 3.2.5 (default, May 19 2013, 14:25:55) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import dill >>> import os >>> dill.dumps(os) b'\x80\x03cdill.dill\n_import_module\nq\x00X\x02\x00\x00\x00osq\x01\x85q\x02Rq\x03.' >>> >>> >>> # and for parlor tricks... >>> class Foo(object): ... x = 100 ... def __call__(self, f): ... def bar(y): ... return f(self.x) + y ... return bar ... >>> @Foo() ... def do_thing(x): ... return x ... >>> do_thing(3) 103 >>> dill.loads(dill.dumps(do_thing))(3) 103 >>> 

Obtenga dill aquí: https://github.com/uqfoundation/dill