我正在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']
另一种方法:可以使用
RedisWorks
库。pip install redisworks
它将python类型转换为Redis类型,反之亦然。所以即使你有嵌套列表,它也会工作:
免责声明:我写了图书馆。这是代码:https://github.com/seperman/redisworks
我想你会碰到类似于list.append()和list.extend()之间区别的语义。我知道这对我有效:
。。。注意在列表前面加上*(map over)运算符!
相关问题 更多 >
编程相关推荐