Decapado de un método estático en Python
He estado tratando de encurtir un objeto que contiene referencias a métodos de clase estática. Pickle falla (por ejemplo enmodule.MyClass.foo
) indicando que no puede ser decapado, comomodule.foo
no existe.
He encontrado la siguiente solución, utilizando un objeto contenedor para ubicar la función en la invocación, guardando la clase de contenedor y el nombre de la función:
class PicklableStaticMethod(object):
"""Picklable version of a static method.
Typical usage:
class MyClass:
@staticmethod
def doit():
print "done"
# This cannot be pickled:
non_picklable = MyClass.doit
# This can be pickled:
picklable = PicklableStaticMethod(MyClass.doit, MyClass)
"""
def __init__(self, func, parent_class):
self.func_name = func.func_name
self.parent_class = parent_class
def __call__(self, *args, **kwargs):
func = getattr(self.parent_class, self.func_name)
return func(*args, **kwargs)
Me pregunto, sin embargo, ¿existe una forma mejor, más estándar, de encurtir un objeto así? No quiero hacer cambios a lo global.pickle
proceso (usandocopy_reg
por ejemplo), pero el siguiente patrón sería genial: class MyClass (object): @picklable_staticmethod def foo (): print "done."
Mis intentos en esto no tuvieron éxito, específicamente porque no pude extraer la clase de propietario defoo
función. Incluso estaba dispuesto a conformarme con una especificación explícita (como@picklable_staticmethod(MyClass)
) pero no conozco ninguna forma de referirme a laMyClass
clase justo donde se está definiendo.
Cualquier idea sería genial!
Yonatan