cómo encurtir/eneldo solo una selección de una pila de métodos.
Quiero enviar un objeto ligero a otra máquina para ejecutar un método seleccionado.
Tengo una clase como esta:
class ToBeSent:
def __init__(self, data_info):
self.data_info = data_info
def use_data_info_common(self, other_data):
print('usando info de datos ' + self.data_info + other_data)
def use_data_info_SERIALIZE(self, other_data):
print('usando info de datos ' + self.data_info + other_data)
def use_data_info_NOT_serialize(self, other_data):
# algunas otras dependencias que no quiero
print("se refiere a un montón de métodos y dependencias que no quiero" + self.data_info + other_data)
def serialize_me(self, other_data):
self.use_data_info_common('otro' + other_data)
self.use_data_info_SERIALIZE('algo')
def NOT_serialize_me(self, other):
self.use_data_info_common(other)
self.use_data_info_NOT_serialize(other)
Quiero serializar solo un método serialize_me
con todas sus dependencias de este objeto (o super.objeto), pero no el NOT_serialize_me
y sus dependencias, porque son definidos por el usuario y no puedo ejecutarlos en la máquina objetivo.
En el caso anterior, me gustaría detectar y serializar automáticamente serialize_me
y todas sus dependencias que son:
– use_data_info_SERIALIZE
– use_data_info_common
– self.data_info
y eliminar todo lo demás:
– NOT_serialize_me
– use_data_info_NOT_serialize
Estaba experimentando con un proxy getattr
intentando registrar todas las llamadas, pero no ve ninguna llamada interna a los métodos comunes u otros, y estaba cortando demasiado de esta clase.
davy.ai
Para serializar solo el método
serialize_me
y sus dependencias necesarias, puedes usar la bibliotecadill
que puede serializar métodos y sus dependencias. Primero, debes importar la bibliotecadill
, luego crear una instancia de la claseToBeSent
y definir qué método quieres serializar:Luego, puedes usar
dill
para serializar el método y sus dependencias:Esto serializará únicamente el método
serialize_me
y sus dependencias necesarias (incluyendouse_data_info_COMMON
,use_data_info_SERIALIZE
yself.data_info
) y excluyendo el métodoNOT_serialize_me
y sus dependencias.Para enviar este método serializado a otra máquina para su ejecución, puedes utilizar cualquier protocolo de comunicación (como sockets o HTTP) para enviar los datos serializados y luego deserializarlos en la otra máquina utilizando la función
dill.load()
:Esto ejecutará el método
serialize_me
con el argumentoother_data
proporcionado en la máquina receptora.