العمل على قاموس الفصول في بيثون
-
25-09-2019 - |
سؤال
على سبيل المثال ، لديّ قاموس ، أنه عندما أدعوه ، يتم عرض "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 () ؛ يمكن أن يجعل هذا أكثر سهولة في تحوير إدخالات قابلة للتغيير في القاموس المستمر ، ولكن إذا تم الوصول إلى العديد من الإدخالات ، فيمكن أن تستهلك كميات هائلة من الذاكرة للذاكرة التخزين المؤقت ، ويمكن أن تجعل العملية وثيقة بطيئة للغاية نظرًا لكتابة جميع الإدخالات التي يتم الوصول إليها مرة أخرى ( لا توجد وسيلة لتحديد الإدخالات التي تم الوصول إليها قابلة للتغيير ، ولا تم تحورها بالفعل).