2017-04-07 5 views
2

Ich versuche, ein benutzerdefiniertes, serialisierbares Python-Objekt in Redis zu speichern, habe aber seltsames Verhalten festgestellt. Die Methode set scheint zu funktionieren, aber die Methode get gibt nur den Wert der Methode __repr__ des Objekts zurück. Zum Beispiel ...Speichern eines benutzerdefinierten Python-Objekts in Redis

import redis 

# initialize the redis connection pool 
rs = redis.Redis(host='localhost', port=6379) 

# define a custom class 
class SomeCustomObject(object): 
    pass 

Wenn ich versuche, die SomeCustomObject als ein Wert zu setzen, scheint es zu funktionieren:

>>> rs.set('c', SomeCustomObject()) 
True 

Allerdings, wenn ich den Wert zurück get, es ist nur der __repr__ string:

>>> rs.get('c') 
'<__main__.SomeCustomObject object at 0x102496710>' 

Wie kann ich die Instanz speichern/abrufen? Ich hatte nicht viel Glück, irgendwelche Informationen dazu in the documentation zu finden, aber sicher bin ich nicht der erste, der darauf stößt?

+0

Wo Serialisierung Sie das Objekt? –

Antwort

4

Verwenden Pickle

die Beize Modul können Sie in serialisiert und Python-Objekte deserialisiert und sie zu Redis passieren.

Daraus so beantworten - https://stackoverflow.com/a/20400288/4403600, es würde wie folgt aussehen:

import pickle 
import redis 

# define a custom class 
class SomeCustomObject(object): 
    pass 

# initialize the redis connection pool 
rs = redis.Redis(host='localhost', port=6379) 

# pickle and set in redis 
rs.set('c', pickle.dumps(SomeCustomObject())) 

# get from redis and unpickle 
unpacked_object = pickle.loads(rs.get('c')) 

Literaturhinweise - https://docs.python.org/2/library/pickle.html

+0

Ah, das ist großartig. Ich war (aus welchem ​​irrsinnigen Grund auch immer) unter dem Eindruck, dass redis-py mit dem Beizen umgehen würde, solange ich die "__getstate__", "__setstate__" Stücke handhabte. Vielen Dank! – Tgsmith61591

Verwandte Themen