Question

Je suis en train de mettre certains sites je rampé dans une étagère, mais l'étagère n'acceptera aucun site des objets. Il acceptera des listes, les chaînes, les tuples, ce que vous avez, mais dès que je l'ai mis dans un site-objet, il se bloque lorsque je tente d'obtenir le contenu de l'étagère

Alors, quand je remplirai mon étagère comme ceci:

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'] fonctionne parfaitement.

Mais si je fais ceci:

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

erreurs de shelve.open("database")['whatever'] avec ce message d'erreur:

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

Je suis complètement déconcerté, et les pythondocs, étrangement, ne pas beaucoup d'informations non plus. Tout ce qu'ils disent est que la clé d'une étagère doit être une chaîne, mais la valeur ou les données peuvent être « un objet arbitraire »

Était-ce utile?

La solution

Il semble que vous refactorisé votre code après sauvegarde des objets dans l'étagère. Lors de la récupération des objets de l'étagère, Python reconstruit l'objet, et il a besoin de trouver la classe d'origine que vous avez probablement déplacé. Ce problème est typique lorsque l'on travaille avec pickle (comme le module shelve fait).

La solution, comme pduel suggère, est de fournir une référence de compatibilité ascendante à la classe au même endroit qu'il était, afin que pickle puisse le trouver. Si vous enregistrez de nouveau tous les objets, la reconstruction de ce fait les conserves au vinaigre, vous pouvez supprimer cette referece en arrière-comatibility.

Autres conseils

Il semble que Python est à la recherche d'un constructeur pour un objet « Site », et ne pas le trouver. Je ne l'ai pas utilisé shelve, mais je me rappelle les règles de ce qui peut décaper sont byzantins, et soupçonne que les règles de shelve sont similaires.

Essayez d'ajouter la ligne:

= site sitemodule.Site

(avec le nom du module fournissant « Site ») avant d'essayer unshelving. Cela garantit que se trouve une classe du site.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top