سؤال

أحاول وضع بعض المواقع التي زحفت في رف ، لكن الرف لا يقبل أي كائنات موقع. سوف يقبل القوائم ، والسلاسل ، و 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

(مع اسم الوحدة النمطية التي توفر "موقع") قبل أن تحاول عدم التحويل. هذا يضمن أنه يمكن العثور على فئة الموقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top