我想使用Python中的shelve模块将元组(1,2,3)作为键。我可以用词典做到这一点:
d = {}
d[(1,2,3)] = 4
但如果我用搁置试试:
s = shelve.open('myshelf')
s[(1,2,3)] = 4
我得到:“TypeError:字符串或整数对象需要密钥,找到元组”
有什么建议吗?
答案 0 :(得分:7)
根据docs,
货架中的值(不是键!) 可以是基本上任意的Python 对象
我的重点:货架钥匙必须是字符串,句号。所以,你需要把你的元组变成一个str;根据你在元组中的含义,repr
,某些separator.join
,酸洗,编组等,可能会有效地用于此目的。
答案 1 :(得分:6)
如何使用元组的repr():
s[repr((1,2,3))] = 4
答案 2 :(得分:1)
如果您想拥有仲裁密钥,为什么不坚持使用词典?另一种选择是使用 repr 或 str 方法在元组周围构建一个包装类,将其更改为字符串。我正在考虑一个库(对货架的自然反应) - 你的元组可以是Dewey decimal中的元素,而 str 会创建一个连续的完整表示。
答案 3 :(得分:0)
这可能是一个老问题,但我遇到了同样的问题。
我经常使用搁置,并且经常想要使用非字符串密钥。 我将shelve-modules类子类化为一个架子,它自动将非字符串键转换为字符串键,并在查询时以原始形式返回它们。 它适用于Python的标准不可变对象:int,float,string,tuple,boolean。