redis/python中的元组:可以存储,不能检索
所以,我让redis使用python——令人兴奋 我需要存储一个元组并在以后检索/解析它。下面的构造不起作用,我想是因为返回的元组被引用了——它的两端都有一个引号 在我看来,引号表明它实际上不是一个元组,而是一个字符串 那么,有人知道如何让redis实际返回一个工作元组吗?谢谢redis/python中的元组:可以存储,不能检索,python,redis,Python,Redis,所以,我让redis使用python——令人兴奋 我需要存储一个元组并在以后检索/解析它。下面的构造不起作用,我想是因为返回的元组被引用了——它的两端都有一个引号 在我看来,引号表明它实际上不是一个元组,而是一个字符串 那么,有人知道如何让redis实际返回一个工作元组吗?谢谢 >>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390) >>> r.lpush('999
>>> 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__'
>>>tup1=('2011-04-05',25.239022322323,0.32093240923490,25.23952032390)
>>>r.lpush('9999',tup1)
1L
>>>r.lpop('9999')
"('2011-04-05', 25.2390232323, 0.3209324092349, 25.23950235239)"
>>>v=r.lpop('9999')
>>>测试=v[0]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“非类型”对象没有属性“\uuuu getitem\uuuu”
您已经从v
弹出了和元素,并且您尝试检索的元素不再存在
试试这个:
>>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390)
>>> r.lpush('9999', tup1)
>>> v = r.lpop('9999')
>>> test = eval(v)[0]
由于返回类型是一个字符串,您需要eval
来计算该类型如果您希望返回元组,我建议使用“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'>
>>>
>>>tup1=('2011-04-05',25.239022322323,0.32093240923490,25.23952032390)
>>>进口泡菜
>>>r.lpush('9999',酸洗倾倒区(tup1))
1L
>>>v=酸洗负荷(r.lpop('9999'))
>>>五
('2011-04-05', 25.2390232323, 0.3209324092349, 25.23950235239)
>>>类型(v)
>>>
我会选择karthikr的解决方案,但通常推荐使用标准库中的literal\u 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\u eval
将创建元组(或列表或dict),但不会运行函数
>>> 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
嗯,但是。。。没用。是的,我真是太蠢了,我跳出堆栈,然后寻找一个值。叹息。。。。。然而,测试返回为(-->接受双引号,然后打开parens,以单引号=打开parens结束。v[1]是单引号,v[2]=2不好。Karthikr解决了它。在我的v行之后,添加这个(或他的版本):z=eval(v)print z[0]----->“2011-04-05”等。18个月后,我发现自己一直在使用pickle,正是这个建议让我开始使用。建议Redis用户按照这个建议熟悉。