如何在Python主文件中按用户选择调用模块内的函数?
解决Python中根据用户选择调用模块函数的TypeError问题
1. 先定义模块文件
创建calc_functions.py,实现两个目标函数:
def product_1(a, b): return a * b def sum_1(a, b): return a + b
2. 错误示例(触发TypeError: 'list' object is not callable)
常见错误写法有两种,都会触发目标报错:
错误场景1:列表存函数名字符串后直接调用
import calc_functions # 错误:存储的是字符串,不是可调用的函数对象 functions = ["product_1", "sum_1"] a = int(input("输入第一个数: ")) b = int(input("输入第二个数: ")) choice = int(input("选择功能:0-乘积,1-求和: ")) # 字符串无法作为函数调用,触发TypeError result = functions[choice](a, b) print(result)
错误场景2:误将列表本身当作函数调用
import calc_functions functions = [calc_functions.product_1, calc_functions.sum_1] a = int(input("输入第一个数: ")) b = int(input("输入第二个数: ")) # 错误:把列表当成函数调用,触发TypeError result = functions(a, b) print(result)
3. 错误原因
- 若列表存储的是字符串形式的函数名,字符串不是可调用对象,直接调用会报错。
- 若误将列表本身当作函数调用(如
functions(a,b)),列表不支持调用操作,同样触发该错误。
4. 正确实现方式
方法一:列表存储函数对象
直接将模块中的函数对象存入列表,列表元素本身就是可调用的函数:
import calc_functions # 存储函数对象,而非字符串 functions = [calc_functions.product_1, calc_functions.sum_1] a = int(input("输入第一个数: ")) b = int(input("输入第二个数: ")) choice = int(input("选择功能:0-乘积,1-求和: ")) # 先校验输入合法性,再调用函数 if 0 <= choice < len(functions): result = functions[choice](a, b) print(f"结果: {result}") else: print("无效的选择")
方法二:字典映射字符串到函数对象
如果用户输入的是字符串(如"乘积"或"求和"),用字典做映射更直观:
import calc_functions # 键为用户输入的标识,值为对应的函数对象 func_map = { "乘积": calc_functions.product_1, "求和": calc_functions.sum_1 } a = int(input("输入第一个数: ")) b = int(input("输入第二个数: ")) choice = input("选择功能:乘积/求和: ").strip() # 校验输入后调用函数 if choice in func_map: result = func_map[choice](a, b) print(f"结果: {result}") else: print("无效的选择")
5. 额外注意事项
- 必须添加输入合法性校验,避免用户输入超出列表索引范围或不存在的字典键,引发索引错误或KeyError。
- 若后续新增函数参数数量不同,需额外处理参数传递逻辑。
内容的提问来源于stack exchange,提问作者Looky Funny
相关产品推荐
相关产品推荐

