2010-05-28 11 views
5

(Tenga en cuenta que estoy trabajando en Python 3, por lo que una solución tiene que trabajar en Python 3.)Python: el uso de `copyreg` para definir reductores para los tipos que ya tienen reductores de

me gustaría utilizar el módulo copyreg para enseñar a Python cómo agrupar funciones. Cuando traté de hacerlo, el objeto _Pickler todavía intentaría recuperar funciones utilizando la función save_global. (Que no funciona para los métodos no unidos, y esa es la motivación para hacer esto.)

Parece que _Pickler primeros intentos de buscar en su propia dispatch para el tipo de objeto que desea conservar en vinagre antes de mirar en copyreg.dispatch_table . No estoy seguro de si esto es intencional.

¿Hay alguna manera de decirle a Python que salte las funciones con el reductor que proporciono?

Respuesta

1

este truco parece funcionar en Python 3.1 ...:

import copyreg 
def functionpickler(f): 
    print('pickling', f.__name__) 
    return f.__name__ 

ft = type(functionpickler) 
copyreg.pickle(ft, functionpickler) 

import pickle 
pickle.Pickler = pickle._Pickler 
del pickle.Pickler.dispatch[ft] 

s = pickle.dumps(functionpickler) 
print('Result is', s) 

Fuera de esto, las dos líneas hacker son:

pickle.Pickler = pickle._Pickler 
del pickle.Pickler.dispatch[ft] 

Es necesario eliminar la entrada para las funciones dispatch 'escriba porque de lo contrario prevalece el registro copyreg; y no creo que puedas hacer eso en Pickler con código C, así que debes configurarlo con el código de Python.

Sería un poco menos de un truco para subclase _Pickler con una clase de su propio, que hace su propia dispatch (copia de los padres y la eliminación de la entrada para el tipo de función), y luego usar la subclase específica (y su método de volcado) en lugar de pickle.dump; sin embargo, también sería un poco menos conveniente que este parche de pickle en sí mismo.

+0

Buen truco. Pero realmente quiero disfrutar de la velocidad C de '_pickle' ... –

Cuestiones relacionadas