سؤال
أحاول وضع بعض المواقع التي زحفت في رف ، لكن الرف لا يقبل أي كائنات موقع. سوف يقبل القوائم ، والسلاسل ، و tuples ، ماذا لديك ، ولكن بمجرد أن أضع في كائن موقع ، فإنه يتعطل عندما أحاول الحصول على محتويات الرف
لذلك عندما أملأ رفاتي مثل هذا:
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']
يعمل تماما.
ولكن إذا فعلت هذا:
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']
الأخطاء في رسالة الخطأ هذه:
AttributeError: 'module' object has no attribute 'Site'
أنا مهزوم تمامًا ، والبيثوندوكس ، الغريب ، ليس لدي الكثير من المعلومات أيضًا. كل ما يقولونه هو أن المفتاح في الرفى يجب أن يكون سلسلة ، ولكن يمكن أن تكون القيمة أو البيانات "كائنًا تعسفيًا"
المحلول
يبدو أنك أعادت إعادة تنظيم الكود الخاص بك بعد حفظ الكائنات في الرف. عند استرداد الأشياء من الرفى ، يعيد Python بناء الكائن ، ويحتاج إلى العثور على الفئة الأصلية التي من المفترض أنك انتقلت. هذه المشكلة نموذجية عند العمل مع pickle
(كما shelve
الوحدة النمطية).
الحل ، كما تشير PDUEL ، هو توفير إشارة توافق متخلف إلى الفصل في نفس الموقع الذي اعتاد أن يكون عليه ، لذلك pickle
يمكن أن تجده. إذا قمت بإعادة توزيع جميع الكائنات ، وبالتالي إعادة بناء المخللات ، يمكنك إزالة هذا الإحالة إلى الوراء.
نصائح أخرى
يبدو أن بيثون يبحث عن مُنشئ لكائن "موقع" ، وليس العثور عليه. لم أستخدم الرفى ، لكنني أتذكر القواعد لما يمكن أن يكون المخلل هي البيزنطية ، وأشك في أن قواعد الرفوف متشابهة.
حاول إضافة الخط:
الموقع = sitemodule.site
(مع اسم الوحدة النمطية التي توفر "موقع") قبل أن تحاول عدم التحويل. هذا يضمن أنه يمكن العثور على فئة الموقع.