TypeError: 'str'不可调用:如何通过字典值调用Python类方法
解决字符串形式的类方法调用问题
问题核心
你碰到的TypeError: 'str' is not callable错误,本质是字典里的function值是字符串,没法直接当函数调用。要实现需求,得把字符串转成对应的可调用类方法对象。
方案1:拆分类与方法名(安全推荐)
这种方式避开了eval的安全风险,适合大多数场景:
# 补全可运行的示例代码 import pandas as pd df = pd.DataFrame({'con': [1, None, 3, None], 'other': [5,6,7,8]}) class cf: @staticmethod def duplicate(field): # 修正原方法的参数逻辑,匹配调用需求 return df[df[field].isnull()] # 目标字典 r={'field':'con','function':'cf.duplicate'} # 拆分字符串里的类名和方法名 class_name, method_name = r['function'].split('.') # 从全局命名空间获取类对象 target_cls = globals()[class_name] # 获取类中的目标方法 target_method = getattr(target_cls, method_name) # 调用方法并传入参数 result = target_method(r['field']) print(result)
注意:原cf.duplicate需要改成静态方法(或类方法),否则调用时必须先实例化类;同时要调整方法参数,确保和调用逻辑匹配。
方案2:使用eval(仅信任字符串来源时用)
如果能保证字典里的字符串完全安全,也可以直接用eval转换:
# 沿用上面的类和字典定义 target_method = eval(r['function']) result = target_method(r['field']) print(result)
⚠️ 提醒:如果字符串来源不可控,eval可能执行恶意代码,务必谨慎使用。
额外修正:原循环的错误
你写的for a in r是遍历字典的键('field'和'function'),这不是正确的处理方式,直接取字典的对应键值即可,不需要循环。
内容的提问来源于stack exchange,提问作者piush
相关产品推荐
相关产品推荐

