2009-09-27 5 views
5

Quiero usar una tupla (1,2,3) como clave usando el módulo shelve en Python. Puedo hacer esto con los diccionarios:¿Alguna manera de usar una tupla como clave en un estante? (Python)

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

Pero si lo intento con balda:

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

me sale: "TypeError: String o un objeto entero espera para la llave, tupla encontraron"

¿Alguna sugerencia?

Respuesta

6

Cómo sobre el uso de la repr() de la tupla:

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

Según el docs,

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

Mi énfasis: claves de la plataforma deben ser cadenas, y punto. Entonces, necesitas convertir tu tupla en un str; dependiendo de lo que tenga en la tupla, repr, algunos separator.join, decapado, clasificación, etc., pueden emplearse con éxito para tal fin.

1

¿Por qué no seguir con los diccionarios si quiere tener claves de arbitraje? La otra opción es crear una clase contenedora alrededor de su tupla con un método repr o str para cambiarla a una cadena. Estoy pensando en una biblioteca (respuesta natural a los estantes): su tupla puede ser los elementos en el Dewey decimal y el str crea una representación completa concatenada.

0

Esto puede ser una vieja pregunta, pero tuve el mismo problema.

Suelo usar shelve's y con frecuencia quiero utilizar teclas que no sean cadenas. Clasifiqué la clase shelve-modules en un estante que convierte automáticamente las llaves que no son de cuerda en llaves de cuerda y las devuelve en su forma original cuando se le consulta. Funciona bien para los objetos inmutables estándar de Python: int, float, string, tuple, boolean.

Se puede encontrar en: https://github.com/North-Guard/simple_shelve

Cuestiones relacionadas