Python脚本TypeError异常及Worker类数据读写问题求助
Worker类数据操作错误修复
问题根源
两个问题的核心原因完全一致:
- 在
__init__方法从shelve加载数据时,错误地将data[key]赋值为key(字符串类型的id),而非shelve中存储的员工信息字典。这导致后续changeInfo修改时操作的是字符串(不支持字典赋值),getInfo打印的也只是id字符串。
修复方案
- 正确加载shelve数据:遍历shelve键时,读取对应的值而非键本身
- 替换全局变量为实例属性:
id_和data作为实例属性管理,避免全局变量污染 - 简化id生成逻辑:用
random.randint(0,9)直接生成0-9的整数,替代原有的冗余判断 - 修正shelve关闭逻辑:with语句会自动关闭文件,无需手动调用
close()
修复后的完整代码
import shelve import random class Worker(): def __init__(self): self.id_ = '' self.data = {} # 正确从shelve加载员工数据 with shelve.open('WorkerDB') as wdb: for key in wdb.keys(): self.data[key] = wdb[key] print(key) check = input('Do you have an id (Yes/No): ') if check == 'No': work_type = input('Enter your work: ') name = input('Enter a name: ') surname = input('Enter a surname: ') age = input('How old: ') # 简化id生成 self.id_ = ''.join(str(random.randint(0,9)) for _ in range(8)) print(f'Your id is {self.id_}') self.data[self.id_] = { 'Name': name, 'Surname': surname, 'Work': work_type, 'Age': age } else: while self.id_ == '': input_id = input('Please enter your id: ') if input_id in self.data: self.id_ = input_id else: print('This is a wrong id') def changeInfo(self): change_part = input('Select which part do you want to change: ') change_word = input(f'Write a new information for {change_part}: ') self.data[self.id_][change_part] = change_word def getInfo(self): print(self.data[self.id_]) def loadInfo(self): with shelve.open('WorkerDB') as f: f[self.id_] = self.data[self.id_] print('Loading completed successfully !!!') if __name__ == '__main__': w1 = Worker()
验证说明
- 运行脚本后,已有id的用户输入正确id,调用
w1.getInfo()会打印完整的员工字典信息 - 调用
w1.changeInfo()修改任意字段后,再调用getInfo()能看到更新后的结果 - 执行
w1.loadInfo()会将修改后的数据保存回shelve文件
内容的提问来源于stack exchange,提问作者Александр Дмитриев
相关产品推荐
相关产品推荐

