Python中从Workers字典取Employee对象触发KeyError问题求助
解决通过编号从字典获取Employee对象时的KeyError及相关错误
问题分析
你的代码存在两个核心问题:
- 输入键不匹配:如果输入员工编号时前后带有空格(比如误输入
1001而非1001),字典中存储的键和查询时的键会不一致,直接触发KeyError。 __str__方法语法错误:Employee类的__str__里错误地把实例属性__name当成方法调用(self.__name()),即便成功获取对象,打印时也会触发AttributeError。
修复方案
1. 统一输入格式,消除空格差异
在存储和查询编号时,对输入字符串做去空格处理,确保键的一致性:
from employee import Employee Workers = {} def main(): new_worker() get_worker_by_id() def new_worker(): worker_name = input('Введите имя сотрудника: ') # 去除编号前后的空格 worker_number = input('Введите его номер: ').strip() worker_depart = input('Введите его отдел: ') worker_post = input('Введите его должность: ') Workers[worker_number] = Employee(worker_name, worker_number, worker_depart, worker_post) def get_worker_by_id(): # 同样处理查询编号的空格 id = input('Чтобы найти сотрудника введите его номер: ').strip() print(Workers[id]) if __name__ == '__main__': main()
2. 修正Employee类的__str__方法
把self.__name()改为self.__name,去掉多余的括号:
class Employee(): def __init__(self, name, number, depart, post): self.__name = name self.__number = number self.__depart = depart self.__post = post def set_name(self, name): self.__name = name def set_number(self, number): self.__number = number def set_depart(self, depart): self.__depart = depart def set_post(self, post): self.__post = post def get_name(self): return self.__name def get_number(self): return self.__number def get_depart(self): return self.__depart def get_post(self): return self.__post def __str__(self): return 'Имя сотрудника: ' + self.__name \ + '\nНомер сотрудника: ' + self.__number \ + '\nОтдел сотрудника: ' + self.__depart \ + '\nДолжность сотрудника: ' + self.__post
可选优化:增加查询容错逻辑
可以在查询时添加判断,避免程序因KeyError直接崩溃:
def get_worker_by_id(): id = input('Чтобы найти сотрудника введите его номер: ').strip() worker = Workers.get(id) if worker: print(worker) else: print(f'Сотрудник с номером {id} не найден')
内容的提问来源于stack exchange,提问作者Bawskre
相关产品推荐
相关产品推荐

