You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本TypeError异常及Worker类数据读写问题求助

Worker类数据操作错误修复

问题根源

两个问题的核心原因完全一致:

  • 在__init__方法从shelve加载数据时,错误地将data[key]赋值为key(字符串类型的id),而非shelve中存储的员工信息字典。这导致后续changeInfo修改时操作的是字符串(不支持字典赋值),getInfo打印的也只是id字符串。

修复方案

  1. 正确加载shelve数据:遍历shelve键时,读取对应的值而非键本身
  2. 替换全局变量为实例属性:id_和data作为实例属性管理,避免全局变量污染
  3. 简化id生成逻辑:用random.randint(0,9)直接生成0-9的整数,替代原有的冗余判断
  4. 修正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,提问作者Александр Дмитриев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:05:19