Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
redis/python中的元组:可以存储,不能检索_Python_Redis - Fatal编程技术网

redis/python中的元组:可以存储,不能检索

redis/python中的元组:可以存储,不能检索,python,redis,Python,Redis,所以,我让redis使用python——令人兴奋 我需要存储一个元组并在以后检索/解析它。下面的构造不起作用,我想是因为返回的元组被引用了——它的两端都有一个引号 在我看来,引号表明它实际上不是一个元组,而是一个字符串 那么,有人知道如何让redis实际返回一个工作元组吗?谢谢 >>> tup1 = ('2011-04-05', 25.2390232323, 0.32093240923490, 25.239502352390) >>> r.lpush('999

所以,我让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__'
>>>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用户按照这个建议熟悉。