31

我在 Redis 中存储一个列表,如下所示:

redis.lpush('foo', [1,2,3,4,5,6,7,8,9])

然后我得到这样的列表:

redis.lrange('foo', 0, -1)

我得到这样的东西:

[b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']

如何将其转换为实际的 Python 列表?

另外,我没有看到其中定义的任何内容RESPONSE_CALLBACKS可以提供帮助?我错过了什么吗?

一个可能的解决方案(在我看来很糟糕)可以是:

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]

更新

好的,所以我得到了解决方案。

实际上,该lpush函数希望所有列表项都作为参数传递,而不是作为单个列表传递。来自 redis-py 源的函数签名清楚地表明......

def lpush(self, name, *values):
    "Push ``values`` onto the head of the list ``name``"
    return self.execute_command('LPUSH', name, *values)

我在上面所做的是将单个列表作为参数发送,然后将其作为 SINGLE 项发送到 redis。

我应该按照答案中的建议解包列表:

redis.lpush('foo', *[1,2,3,4,5,6,7,8,9])

它返回我期望的结果......

redis.lrange('foo', 0, -1)
[b'9', b'8', b'7', b'6', b'5', b'4', b'3', b'2', b'1']
4

3 回答 3

27

我认为您遇到的语义类似于list.append()list.extend()之间的区别。我知道这对我有用:

myredis.lpush('foo', *[1,2,3,4])

...注意列表前缀的 * (map-over) 运算符!

于 2013-04-06T11:27:58.853 回答
2

另一种方式:您可以使用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

它将 python 类型转换为 Redis 类型,反之亦然。所以即使你有嵌套列表,它也会起作用:

>>> 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'>

免责声明:我写了这个库。这是代码:https ://github.com/seperman/redisworks

于 2016-08-30T05:57:41.160 回答
0
import json
r = [b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']
rstr = r[0]
res_list = json.loads(rstr)
于 2013-04-06T11:15:31.147 回答