python - lpush - redis hkeys
Redis: Cómo analizar un resultado de lista (4)
Estoy almacenando una lista en Redis así:
redis.lpush(''foo'', [1,2,3,4,5,6,7,8,9])
Y luego recupero la lista de esta manera:
redis.lrange(''foo'', 0, -1)
y me sale algo como esto:
[b''[1, 2, 3, 4, 5, 6, 7, 8, 9]'']
¿Cómo puedo convertir esto a la lista real de Python?
Además, no veo nada definido en RESPONSE_CALLBACKS
que pueda ayudar? ¿Me estoy perdiendo de algo?
Una posible solución (que en mi opinión apesta) puede ser:
result = redis.lrange(''foo'',0, -1)[0].decode()
result = result.strip(''[]'')
result = result.split('', '')
# lastly, if you know all your items in the list are integers
result = [int(x) for x in result]
ACTUALIZAR
Ok, así que tengo la solución.
En realidad, la función lpush
espera que todos los elementos de la lista se pasen como argumentos y NO como una sola lista. La firma de la función de la fuente redis-py deja en claro ...
def lpush(self, name, *values):
"Push ``values`` onto the head of the list ``name``"
return self.execute_command(''LPUSH'', name, *values)
Lo que estoy haciendo arriba es enviar una lista única como un argumento, que luego se envía a redis como un elemento ÚNICO.
Debería estar desempaquetando la lista como se sugiere en la respuesta:
redis.lpush(''foo'', *[1,2,3,4,5,6,7,8,9])
que devuelve el resultado que espero ...
redis.lrange(''foo'', 0, -1)
[b''9'', b''8'', b''7'', b''6'', b''5'', b''4'', b''3'', b''2'', b''1'']
Creo que te encuentras con una semántica que es similar a la distinción entre list.append () y list.extend () . Sé que esto funciona para mí:
myredis.lpush(''foo'', *[1,2,3,4])
... note el operador * (map-over) prefijando la lista!
En realidad, esta pregunta duplica esto: cómo impulsar una secuencia completa para redisponer en Python . El problema y su solución son absolutamente iguales: para obtener los datos de la lista correctamente, primero debemos empujarlos correctamente.
Otra forma: puedes usar la biblioteca de RedisWorks
.
pip install redisworks
>>> from redisworks import Root
>>> root = Root()
>>> root.foo = [1,2,3,4,5,6,7,8,9] # saves it to Redis as a list
...
>>> print(root.foo) # loads it from Redis later
Convierte tipos de python a tipos redis y viceversa. Así que incluso si hubiera anidado la lista, habría funcionado:
>>> root.sides = [10, [1, 2]] # saves it as list in Redis.
>>> print(root.sides) # loads it from Redis
[10, [1, 2]]
>>> type(root.sides[1])
<class ''list''>
Descargo de responsabilidad: escribí la biblioteca. Aquí está el código: https://github.com/seperman/redisworks
import json
r = [b''[1, 2, 3, 4, 5, 6, 7, 8, 9]'']
rstr = r[0]
res_list = json.loads(rstr)