Redis:如何解析列表结果

34

我正在像这样在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)

我上面所做的是将单个列表作为参数发送,然后将其作为一个单一项目发送到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']
3个回答

35

我认为你正在遇到语义上的细微差别,类似于list.append()list.extend()之间的区别。我知道这对我起作用:

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

请注意列表前面的*(map-over)操作符!


对的,这是lpush()传递两个参数(键和一个恰好是列表的单个对象)与传递“n+1”个对象(键和来自列表内部的每个对象)之间的区别。这是Python中的“var args”或“n-ary”行为。对于内置的列表类型,我们将使用“extend()”而不是“append()”。 - Jim Dennis

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


身份验证失败。即使我已经传递了密码。 - jeevu94
我有机会时会修复认证问题。 - Seperman

-1
import json
r = [b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']
rstr = r[0]
res_list = json.loads(rstr)

这个回复毫无意义。他正在使用Redis列表和 *PUSH 和 LRANGE Redis 操作。将 Python 选项 JSON 编码只对使用 Redis 标量类型的 SET 和其他类似操作有意义。他会寻求 Redis 提供的一致性,以在 *POP 和相关操作的列表元素上进行操作,并被迫在每次操作时设置和获取整个列表。 - Jim Dennis
有时候更具体会更好。 - ashim888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接