141 Stimmen

Gibt es eine einfache Möglichkeit, eine Python-Funktion (oder anderweitig serialisieren seinen Code) zu beizen?

Ich versuche, eine Funktion über eine Netzwerkverbindung zu übertragen (mit asyncore). Gibt es eine einfache Möglichkeit, eine Python-Funktion (eine, die, in diesem Fall zumindest, keine Nebenwirkungen haben) für die Übertragung wie diese zu serialisieren?

Im Idealfall hätte ich gerne ein Paar Funktionen, die diesen ähnlich sind:

def transmit(func):
    obj = pickle.dumps(func)
    [send obj across the network]

def receive():
    [receive obj from the network]
    func = pickle.loads(s)
    func()

1voto

Die grundlegenden Funktionen, die für dieses Modul verwendet werden, decken Ihre Abfrage ab, und Sie erhalten die beste Kompression über den Draht; siehe den instruktiven Quellcode:

y_serial.py Modul :: Python Objekte mit SQLite lagern

"Serialisierung + Persistenz :: in wenigen Zeilen Code Python-Objekte in SQLite komprimieren und annotieren; später chronologisch nach Schlüsselwörtern ohne SQL abrufen. Nützlichstes "Standard"-Modul für eine Datenbank zur Speicherung schemafreier Daten."

http://yserial.sourceforge.net

0voto

memeplex Punkte 1937

Hier ist eine Hilfsklasse, die Sie verwenden können, um Funktionen zu verpacken, um sie picklable zu machen. Die bereits erwähnten Vorbehalte für marshal gelten, aber es wird versucht, wann immer möglich, Pickles zu verwenden. Es werden keine Anstrengungen unternommen, um Globals oder Closures bei der Serialisierung zu erhalten.

    class PicklableFunction:
        def __init__(self, fun):
            self._fun = fun

        def __call__(self, *args, **kwargs):
            return self._fun(*args, **kwargs)

        def __getstate__(self):
            try:
                return pickle.dumps(self._fun)
            except Exception:
                return marshal.dumps((self._fun.__code__, self._fun.__name__))

        def __setstate__(self, state):
            try:
                self._fun = pickle.loads(state)
            except Exception:
                code, name = marshal.loads(state)
                self._fun = types.FunctionType(code, {}, name)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X