Redis的:如何分析一个列表结果(Redis: How to parse a list resul

2019-08-20 00:20发布

我保存这样的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]

UPDATE

好了,我得到了解决。

实际上, 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']

Answer 1:

我认为你撞到语义这是list.append()list.extend之间类似的区别()。 我知道,这对我的作品:

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

...注意*(地图上)运算符前缀列表!



Answer 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

它把蟒蛇类型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



Answer 3:

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


Answer 4:

其实这个问题重复此: 如何来推动整个序列在Python Redis的 。 问题及其解决方案是完全一样的-正确地获取列表数据,我们首先应该他们以适当的方式。



文章来源: Redis: How to parse a list result
标签: python redis