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