métodos de instancia no pueden automáticamente ser conservados en vinagre en tanto Python 2 o Python 3.¿Es esta la manera correcta de saltear métodos de instancia? Si es así, ¿por qué no está en Python 3?
necesito para conservar en vinagre métodos de instancia con Python 3 y I portados código ejemplo de Steven Bethard a Python 3:
import copyreg
import types
def _pickle_method(method):
func_name = method.__func__.__name__
obj = method.__self__
cls = method.__self__.__class__
return _unpickle_method, (func_name, obj, cls)
def _unpickle_method(func_name, obj, cls):
for cls in cls.mro():
try:
func = cls.__dict__[func_name]
except KeyError:
pass
else:
break
return func.__get__(obj, cls)
copyreg.pickle(types.MethodType, _pickle_method, _unpickle_method)
¿Es esta método a prueba de tontos para métodos de instancia de decapado? ¿O pueden algunas cosas ir terriblemente mal? Lo he probado con algunas clases simuladas y todo parece funcionar.
Si nada puede salir mal, ¿por qué no es posible en Python 3 los métodos de instancia de pickle estándar?
Debido a que todas las referencias deben ser accesibles a nivel mundial. http://www.velocityreviews.com/forums/t395502-why-cant-you-pickle-instancemethods.html –
@Lennart Si miras el enlace, verás que encontré el mismo hilo yo mismo. Sin embargo, no explica muy bien cuál sería la diferencia real entre el decapado de un método y la función. Sé que también algunas funciones, como la función lambda, no pueden escamotearse, pero en ese caso se produce un error cuando no es posible. ¿Por qué no lo mismo para los métodos? –