es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para serializar solo el método serialize_me y sus dependencias necesarias, puedes usar la biblioteca dill que puede serializar métodos y sus dependencias. Primero, debes importar la biblioteca dill, luego crear una instancia de la clase ToBeSent y definir qué método quieres serializar:

    import dill
    
    # Crear una instancia de la clase ToBeSent
    obj = ToBeSent("data_info")
    
    # Definir qué método serializar
    serialized_method = obj.serialize_me
    

    Luego, puedes usar dill para serializar el método y sus dependencias:

    serialized = dill.dumps(serialized_method)
    

    Esto serializará únicamente el método serialize_me y sus dependencias necesarias (incluyendo use_data_info_COMMON, use_data_info_SERIALIZE y self.data_info) y excluyendo el método NOT_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():

    # En la máquina receptora
    deserialized_method = dill.loads(serialized)
    deserialized_method("other_data")
    

    Esto ejecutará el método serialize_me con el argumento other_data proporcionado en la máquina receptora.

Comments are closed.