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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:55:19