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的参数透传能力,只是外层调用时的传参位置写错了。
正确修改方案
调整调用逻辑即可,不需要改动核心动态调用的设计:
- 调用动态方法时,第一个位置固定传函数名字符串,目标函数需要的所有参数,依次作为后续参数传给
dynamic_call即可,绝对不要给存储函数名的字符串变量加括号传参。 - 可选优化:给
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
相关产品推荐
相关产品推荐

