Pregunta

Estoy tratando de poner algunos sitios me arrastré en una estantería, pero el dejar de lado no aceptará cualquier sitio de objetos. Se aceptará listas, cadenas, tuplas, lo que tiene, pero tan pronto como puse en un sitio a objetos, que se bloquea cuando intento de obtener los contenidos del estante

Así que cuando lleno mi estantería como esto:

def add_to_shelve(self, site):
    db = shelve.open("database")
    print site, site.url
    for word in site.content:
        db[word] = site.url #site.url is a string, word has to be one too

shelve.open("database")['whatever'] funciona perfectamente.

Pero si hago esto:

def add_to_shelve(self, site):
    db = shelve.open("database")
    print site, site.url
    for word in site.content:
        db[word] = site #site is now an object of Site

shelve.open("database")['whatever'] errores hacia fuera con este mensaje de error:

AttributeError: 'module' object has no attribute 'Site'

Estoy completamente perplejo, y los pythondocs, extrañamente, no tienen mucha información, ya sea. Todo lo que dicen es que la clave en una estantería tiene que ser una cadena, pero el valor o los datos pueden ser "un objeto arbitrario"

¿Fue útil?

Solución

Parece que refactorizado su código después de guardar objetos en la estantería. Al recuperar objetos de la estantería, Python reconstruye el objeto, y tiene que encontrar la clase original que, presumiblemente, se ha mudado. Este problema es típico cuando se trabaja con pickle (como el módulo shelve hace).

La solución, como pduel indica, es para proporcionar una referencia de compatibilidad hacia atrás a la clase en la misma ubicación que lo que solía ser, de modo que pickle puede encontrarlo. Si vuelve a guardar todos los objetos, la reconstrucción de ese modo los pepinillos, puede eliminar dicho referece revés-comatibility.

Otros consejos

Parece que Python está buscando un constructor para un objeto 'Sitio', y no encontrarlo. No he utilizado estantería, pero recordar las normas para lo que puede ser en escabeche se bizantino, y sospechar las normas de estantería son similares.

Trate de añadir la línea:

Site = sitemodule.Site

(con el nombre del módulo, de 'Sitio') antes de intentar unshelving. Esto asegura que una clase del sitio se pueden encontrar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top