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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:35:18