سؤال

على سبيل المثال ، لديّ قاموس ، أنه عندما أدعوه ، يتم عرض "Ember Attack".

#import shelve
class Pokemon():
"""Each pokemon's attributes"""

def __init__(self):
    self.id=[]
    self.var1=[]
    self.var2=[]
    self.var3=[]
    self.var4=[]
    self.var5=[]

def __str__(self):
     showList=['id','var1', 'var2', 'var3', 'var4', 'var5']

#dict1=shelve.open("shelve.dat")
dict1={}
dict1["Charmander"]=Pokemon()
dict1["Charmander"].var1="Ember Attack"
#dict1.sync()
print dict1["Charmander"].var1
#dict1.close()

ومع ذلك ، عندما أبدأ في استخدام الرفوف بدلاً من القاموس ، أحصل على فارغ عندما أدعو VAR1.

import shelve

class Pokemon():
"""Each patient's attributes"""

def __init__(self):
    self.id=[]
    self.var1=[]
    self.var2=[]
    self.var3=[]
    self.var4=[]
    self.var5=[]

def __str__(self):
    showList=['id','var1', 'var2', 'var3', 'var4', 'var5']

dict1=shelve.open("shelve.dat")
#dict1={}

dict1["Charmander"]=Pokemon()
dict1["Charmander"].var1="Ember Attack"

dict1.sync()

print dict1["Charmander"].var1

dict1.close()

الفرق الوحيد هو أنني جعلت Dict1 A Dictionary بدلاً من القاموس العادي. ربما يتعلق الأمر بنطاق الذاكرة أو شيء من هذا القبيل. على أي حال ، هل يمكن لأحد أن يساعدني في مراجعة الكود الخاص بي حتى يعمل مع الأرفف؟ شكرًا!

هل كانت مفيدة؟

المحلول

dict1=shelve.open("shelve.dat", writeback=True)

يمكنك أيضًا تحديد البروتوكول الذي يجب أن يحسن الأداء

dict1=shelve.open("shelve.dat", protocol=2, writeback=True)

بسبب دلالات الثعبان ، لا يمكن أن يعرف الرف عندما يتم تعديل إدخال قابلة للتغيير في القوانين. بشكل افتراضي ، تتم كتابة الكائنات المعدلة فقط عند تعيينها على الرف (انظر المثال). إذا تم ضبط معلمة الكتابة الاختيارية على TRUE ، يتم أيضًا تخزين جميع الإدخالات التي تم الوصول إليها في الذاكرة ، ويتم كتابتها مرة أخرى على Sync () و Close () ؛ يمكن أن يجعل هذا أكثر سهولة في تحوير إدخالات قابلة للتغيير في القاموس المستمر ، ولكن إذا تم الوصول إلى العديد من الإدخالات ، فيمكن أن تستهلك كميات هائلة من الذاكرة للذاكرة التخزين المؤقت ، ويمكن أن تجعل العملية وثيقة بطيئة للغاية نظرًا لكتابة جميع الإدخالات التي يتم الوصول إليها مرة أخرى ( لا توجد وسيلة لتحديد الإدخالات التي تم الوصول إليها قابلة للتغيير ، ولا تم تحورها بالفعل).

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