2016-04-30 14 views
4

Ich habe die folgende Klassendefinition in einer py-Datei:Pyro4 mit Rückrufen

class this_obj(object): 

    def __init__(self): 
     self._apple = 5.0 
     self.observ_apple = [] 

    def setter(self, value): 
     if (self._apple != value): 
      self._apple = value 
      for callback in self.observ_apple: 
       callback(self._apple) 

    def getter(self): 
     return self._apple 

    # apply property 
    apple = property(getter, setter) 

    # binder functions 
    def bind_to_apple(self, callback): 
     self.observ_apple.append(callback) 

Und ich habe diesen Hauptcode in einer anderen Datei:

import handler_obj 

def print_on_change(value): 
    print("apple change!!! " + str(value)) 

if __name__ == "__main__": 
    q = handler_obj.this_obj() 
    q.bind_to_apple(print_on_change) 
    print(q.getter()) 
    q.setter(30) 
    print(q.getter()) 

Wenn Sie diesen Code ausführen können Sie sehen, dass es läuft. Jetzt versuche ich den gleichen Code mit Pyro4 auszuführen. Ich laufe immer in die folgende Fehlermeldung Während ich dies tat:

Pyro4.errors.SerializeError: unsupported serialized class: builtins.function 

für die folgende Zeile ein:

q.bind_to_apple(print_on_change) 

Meine Frage wäre: Ist dies überhaupt möglich mit Pyro4 oder ist dies eine Einschränkung des Serialisierers? Kann dies gelöst werden, wenn ich versuche, Gurke statt Schlange zu verwenden?

Wenn nicht, gibt es eine Alternative zu Pyro4, die Sie mir für solche Fälle empfehlen können?

Vielen Dank im Voraus.

Antwort

1

Ich habe gerade eine Lösung dafür gefunden. Wenn Sie den Serializer in configuration.py auf Dill als Funktion ändern, werden auch Callbacks behandelt.

+0

Bearbeiten Sie die Datei configuration.py nicht selbst, da sie Teil der Bibliothek ist! Verwenden Sie eine andere Möglichkeit, um das Konfigurationselement zu ändern (z. B. mithilfe der entsprechenden Umgebungsvariablen). –