4

所以,我已经让 redis 与 python 一起工作——令人兴奋!

我需要存储一个元组并稍后检索/解析它。下面的构造不起作用,我认为是因为返回的元组被引用了——它的两端都有一个引号。

在我看来,引号表明它实际上不是一个元组,而是一个字符串。

那么有谁知道如何让redis真正返回一个工作元组?谢谢!

>>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390)
>>> r.lpush('9999', tup1)
1L
>>> r.lpop('9999')
"('2011-04-05', 25.2390232323, 0.3209324092349, 25.23950235239)"
>>> v = r.lpop('9999')
>>> test=v[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
4

3 回答 3

12

如果您想这样恢复元组,我建议使用“pickle”。

>>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390)
>>> import pickle
>>> r.lpush('9999', pickle.dumps(tup1))
1L
>>> v = pickle.loads(r.lpop('9999'))
>>> v
('2011-04-05', 25.2390232323, 0.3209324092349, 25.23950235239)
>>> type(v)
<type 'tuple'>
>>> 
于 2014-01-21T04:26:05.677 回答
2

我会选择 karthikr 的解决方案,但literal_eval通常建议使用标准库作为安全的替代方案,因为eval如果你给它有趣的输入,它可以执行任意代码

>>> tup1 = "print('Dont use eval! ' * 2)"
>>> r.lpush('9999', tup1)
>>> v = r.lpop('9999')
>>> test = eval(v)
Dont use eval! Dont use eval!

literal_eval将创建您的元组(或列表或字典),但不会运行函数。

>>> from ast import literal_eval
>>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390)
>>> tup2 = "print('Dont use eval! ' * 2)"
>>> r.lpush('9999', tup2, tup1)
>>> v1 = r.lpop('9999')
>>> print(literal_eval(v1) == tup1)
True

>>> literal_eval(r.lpop('9999'))  # ==> SyntaxError: invalid syntax
于 2014-11-12T15:57:43.687 回答
0

您已经拥有popped和元素,v并且您尝试检索的元素不再存在。

尝试这个:

>>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390)
>>> r.lpush('9999', tup1)
>>> v = r.lpop('9999')
>>> test = eval(v)[0]

由于返回类型是字符串,因此您需要eval评估类型

于 2013-05-21T01:22:06.907 回答