Ich versuche Pickle zu verwenden, um Python-Objekte über die Leitung zwischen 2 Servern zu übertragen. Ich habe eine einfache Klasse, die Unterklassen dict
und ich versuche, Gurke für die Rangierung zu verwenden:Warum python pickle nicht eine Methode als Standardargument serialisieren?
def value_is_not_none(value):
return value is not None
class CustomDict(dict):
def __init__(self, cond=lambda x: x is not None):
super().__init__()
self.cond = cond
def __setitem__(self, key, value):
if self.cond(value):
dict.__setitem__(self, key, value)
Ich versuchte zunächst pickle
für die Rangierung zu verwenden, aber wenn ich un-vermarshallten erhielt ich einen Fehler an den im Zusammenhang lambda
Ausdruck.
Dann habe ich versucht, das Marshalling mit dill
zu tun, aber es schien, die __init__
wurde nicht aufgerufen.
Dann habe ich versucht wieder mit pickle
, aber ich bestand die value_is_not_none()
Funktion als cond
Parameter - wieder die __init__()
nicht schien aufgerufen werden, und die un-Rangierung gescheitert am __setitem__()
(cond
ist None
).
Warum ist das? Was fehlt mir hier?
Wenn ich versuche, den folgenden Code auszuführen:
obj = CustomDict(cond=value_is_not_none)
obj['hello'] = ['world']
payload = pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL)
obj2 = pickle.loads(payload)
es nicht mit
AttributeError: 'CustomDict' object has no attribute 'cond'
Dies ist eine andere Frage als: Python, cPickle, pickling lambda functions , als ich versuchte dill
mit lambda
verwenden und es gescheitert Arbeit, und ich habe auch versucht, eine Funktion zu übergeben und es ist auch fehlgeschlagen.
Bitte führen Sie den nicht funktionierenden Code mit dem Zurückverfolgungs es – holdenweb
@holdenweb gibt - werfen Sie einen Blick auf das Beispiel i hinzugefügt und die Ausgabe. danke –
@MartijnPieters - das ist eine andere Frage als: [python-cpickle-pickling-lambda-Funktionen] (http://stackoverflow.com/questions/16626429/python-cpickle-pickling-lambda-functions) wie ich es versucht habe Dill mit Lambda und es versäumt zu arbeiten, und ich habe auch versucht, eine Funktion übergeben und es auch fehlgeschlagen - alles in der Frage –