我像这样在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帮助吗?我想念什么吗?
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来源的功能签名使其清晰可见…
lpush
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']
我认为您正在碰到类似于 list.append() 和 list.extend() 之间的区别的语义。我知道这对我有用:
myredis.lpush('foo', *[1,2,3,4])
…请注意*(映射)运算符在列表前加了前缀!