2013-05-21 103 views
2

所以,我有redis使用python - 令人興奮!元組中的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__' 

回答

1

您已從vpopped和元素和元素你都試圖檢索已不復存在。

試試這個:

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

由於返回類型爲字符串,你需要eval評估類型

+0

Doh but ... did not work。是的,我愚蠢的想彈出堆棧然後尋找價值。嘆息.....然而,測試返回爲( - >採用雙引號,然後打開parens,用單引號= open parens關閉。v [1]是單引號,v [2] = 2 –

+0

檢查編輯。 – karthikr

+0

Karthikr釘住它。在我的v行後,添加此(或他的版本): z = eval(v) print z [0] ---->'2011-04-05 ' 等 –

8

如果你想獲得的元組回正因爲如此,我推薦使用「泡菜」。

>>> 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'> 
>>> 
+0

18個月後,我發現自己一直都在使用醃菜,這是讓我開始的建議,建議Redis用戶按照這個建議熟悉。 –

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 
相關問題