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

Python动态函数传参调用报'str' object is not callable错误

错误产生原因

开头的openpyxl Data Validation警告是读取带数据验证规则的Excel文件时的常规提示,和本次调用报错没有关联。本次报错核心问题是对字符串类型做了函数调用操作:

  • 代码中abcd_3 = 'multi21'定义的是字符串值,不是可调用的函数对象。书写abcd_3(show_test)时,Python会直接尝试把'multi21'这个字符串当作函数执行、传入show_test参数,但字符串本身没有调用实现,直接触发TypeError: 'str' object is not callable报错。
  • 之前无参调用ich.dynamic_call(abcd_2)能正常运行,是因为你直接把函数名字符串传给了dynamic_call方法,方法内部通过getattr拿到类实例上对应的方法再执行,全程没有提前对字符串做调用操作。
  • 你写的dynamic_call方法本身已经预留了*args、**kwargs的参数透传能力,只是外层调用时的传参位置写错了。
正确修改方案

调整调用逻辑即可,不需要改动核心动态调用的设计:

  1. 调用动态方法时,第一个位置固定传函数名字符串,目标函数需要的所有参数,依次作为后续参数传给dynamic_call即可,绝对不要给存储函数名的字符串变量加括号传参。
  2. 可选优化:给dynamic_call方法增加错误提示和返回值透传,方便调试和使用有返回值的计算函数。

修正后的代码示例

首先修改considerations.py里的错误调用行:

# considerations.py 调用部分修正后
ich = InputClearingHouse()

abcd_2 = 'test'
abcd_3 = 'multi21'
show_test = 'dynamite'

ich.dynamic_call(abcd_2)
# 正确传参格式:dynamic_call(函数名字符串, 参数1, 参数2, ...)
ich.dynamic_call(abcd_3, show_test)

可选优化input_clearing_house.py里的dynamic_call方法:

def dynamic_call(self, name, *args, **kwargs):
    call_fct = f'{name}'
    if not hasattr(self, call_fct):
        raise AttributeError(f"找不到名为{name}的可调用方法")
    func = getattr(self, call_fct)
    if not callable(func):
        raise TypeError(f"{name}不是可调用的方法")
    # 增加return,把目标函数的执行结果返回,适配distance_to_target这类有返回值的函数
    return func(*args, **kwargs)

修正后运行的预期输出:

init ICH...
oouh weee look at me
dynamite

后续你从Excel读取到函数名、对应的输入参数列表后,直接用ich.dynamic_call(函数名, *参数列表)的格式批量调用即可,完全不需要为每个Decision Evaluator硬编码子调用逻辑,符合你最初的设计目标。


内容的提问来源于stack exchange,提问作者soge king

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:39:16