2009-09-27 7 views
5

Voglio usare una tupla (1,2,3) come chiave usando il modulo shelve in Python. Posso farlo con dizionari:Un modo per usare una tupla come chiave in una mensola? (Python)

d = {} 
d[(1,2,3)] = 4 

Ma se provo con ripiano:

s = shelve.open('myshelf') 
s[(1,2,3)] = 4 

ottengo: "TypeError: String o un oggetto Integer previsto per la chiave, tuple trovato"

Eventuali suggerimenti?

risposta

6

ne dite di usare il repr() della tupla:

s[repr((1,2,3))] = 4 
7

Come per la docs,

the values (not the keys!) in a shelf can be essentially arbitrary Python objects

mia enfasi: le chiavi scaffale devono essere stringhe, punto. Quindi, devi trasformare la tua tupla in una str; a seconda di ciò che si avrà nella tupla, repr, alcuni separator.join, decapaggio, marshalling, ecc., potrebbero essere fruttuosamente impiegati a tale scopo.

1

Perché non restare con i dizionari se si desidera avere le chiavi arbitray? L'altra opzione è creare una classe wrapper attorno alla tupla con un metodo repr o str per cambiarlo in una stringa. Sto pensando a una libreria (risposta naturale agli scaffali): la tua tupla può essere gli elementi nello Dewey decimal e lo str crea una rappresentazione completa concatenata.

0

Questa potrebbe essere una domanda vecchia, ma ho avuto lo stesso problema.

Spesso uso shelve e spesso voglio usare chiavi non stringa. Ho suddiviso la classe dei moduli shelve in uno scaffale che converte automaticamente chiavi non stringa in chiavi stringa e li restituisce in forma originale durante la ricerca. Funziona bene per gli oggetti immutabili standard di Python: int, float, string, tuple, boolean.

Si può trovare in: https://github.com/North-Guard/simple_shelve

Problemi correlati