Python用字典实现switch case时如何正确调用选项对应方法
字典实现switch-case时函数调用异常的修复方案
你当前代码的核心问题是字典初始化阶段就把所有函数加括号执行了,存到字典里的是函数运行后的返回值,不是函数本身,所以根本达不到选择选项后再触发对应逻辑的效果,同时还存在参数不匹配、变量作用域、退出分支类型错误的问题,按以下步骤修改即可:
错误点说明
- 字典映射值写
emp.addEmployeeInDict()带括号,属于立即调用:代码运行到定义options字典这一行时,新增、删除员工的方法就会全部执行一遍,完全等不到用户输入选项 - 方法参数不匹配:
addEmployeeInDict只定义了self参数,后续调用时传入employee_dictionary会触发参数数量报错 - 退出选项值为字符串"Exit":后续把它当函数调用会直接抛出
TypeError: 'str' object is not callable - 方法内用局部变量
employeeDetails存新增数据:修改不会同步到外部的全局员工字典,新增的员工信息存不住
修正后代码
主循环逻辑
import copy employee_dictionary = {} proceed = True while proceed: print('\n Employee Management System\n') print('\t1. Add a new employee') print('\t2. Delete an existing employee') print('\t3. Save and Quit\n') option_choice = int(input('Enter an option to continue: ')) # 字典存函数引用,不要加括号触发立即执行 options = { 1: emp.addEmployeeInDict, 2: emp.deleteEmpUsingID, 3: lambda emp_dict: False # 退出分支统一为可调用对象,返回False终止循环 } # 用户选择后再执行对应函数,传入员工字典参数 proceed = options[option_choice](employee_dictionary)
修正后的新增员工方法
def addEmployeeInDict(self, employee_dictionary): old_detailsOfEmp = [] try: emp_ID = int(input("Enter emp ID: ")) old_detailsOfEmp.clear() for j in range(3): if j == 0: emp_Name = input("Enter Emp Name :") old_detailsOfEmp.append(emp_Name) elif j == 1: emp_dept = input("Enter Emp Dept :") old_detailsOfEmp.append(emp_dept) else: emp_Sal = int(input("Enter Emp Sal :")) old_detailsOfEmp.append(emp_Sal) # 直接修改传入的外部员工字典,无需额外用局部变量存储 employee_dictionary[emp_ID] = copy.deepcopy(old_detailsOfEmp) return True except ValueError: print("Input error, please enter valid number for ID and salary") return True
注意:
deleteEmpUsingID方法也要同步调整参数,改为接收员工字典作为入参,保证调用时参数匹配。所有映射到字典的选项值必须是可调用对象,不能混存字符串、数字这类非callable类型。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

