sto memorizzazione di una lista in Redis come questo:Redis: Come fare il parsing di conseguenza lista
redis.lpush('foo', [1,2,3,4,5,6,7,8,9])
E poi ho la lista di nuovo in questo modo:
redis.lrange('foo', 0, -1)
e ottengo qualcosa di simile this:
[b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']
Come posso convertire questo in vero elenco Python?
Inoltre, non vedo nulla definito in RESPONSE_CALLBACKS
che può essere d'aiuto? Mi sto perdendo qualcosa?
Una possibile soluzione (che a mio parere fa schifo) può essere:
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]
UPDATE
Ok, così ho ottenuto la soluzione.
In realtà, la funzione lpush
si aspetta che tutti gli elementi della lista essere passati come argomenti e non come un unico elenco. La firma funzione dalla fonte Redis-py rende chiaro ...
def lpush(self, name, *values):
"Push ``values`` onto the head of the list ``name``"
return self.execute_command('LPUSH', name, *values)
Quello che sto facendo qui sopra è inviare un unico elenco come argomento, che viene poi inviato a Redis come un singolo elemento.
dovrei disimballaggio lista invece come suggerito la risposta:
redis.lpush('foo', *[1,2,3,4,5,6,7,8,9])
che restituisce il risultato mi aspetto ...
redis.lrange('foo', 0, -1)
[b'9', b'8', b'7', b'6', b'5', b'4', b'3', b'2', b'1']
Esatto, è la differenza tra lpush() essere passati due argomenti (la chiave e un singolo oggetto che sembra essere una lista) e passare gli oggetti "n + 1" (chiave e ogni oggetto * dall'interno * dell'elenco). Questo è il comportamento "var args" o "n-ary" in Python. Per il tipo di lista integrata useremmo "extend()" piuttosto che "append()". –