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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:45:49