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

Python报错:'str'对象不可调用,如何将字符串转为可调用函数?

解决'Str' object is not callable错误:从字符串获取模块中的函数对象

嘿,我一眼就看出问题所在了——你现在生成的readData是一堆函数名字符串(比如'ob.rd_sat1'),而不是真正的可调用函数对象,自然没法像调用函数那样执行它。下面给你几个简单可行的解决方案:

方案1:用getattr()直接获取函数对象

这是最简洁的方法,通过getattr()从ob模块中根据函数名的后缀直接拿到对应的函数对象:

import numpy as np
# 确保ob模块已经被正确导入
dataList= ['sat1', 'sat2', 'sat3', 'sat4']
# 直接生成函数对象列表,而非字符串
readData = [getattr(ob, f'rd_{sat}') for sat in dataList]
# 循环调用每个函数,同时传入对应的文件名
for func, sat_name in zip(readData, dataList):
    func(f'file.{sat_name}')

这样readData里就全是可以直接调用的函数对象了,完全解决字符串不可调用的问题。

方案2:手动创建函数映射(适合少量函数场景)

既然你只需要用到模块里的4个函数,也可以手动做一个名称到函数的映射字典,可读性更强,也避免了反射操作:

import numpy as np
# 手动映射sat名称到对应的函数
sat_func_map = {
    'sat1': ob.rd_sat1,
    'sat2': ob.rd_sat2,
    'sat3': ob.rd_sat3,
    'sat4': ob.rd_sat4
}
dataList= ['sat1', 'sat2', 'sat3', 'sat4']
# 遍历调用即可
for sat_name in dataList:
    sat_func_map[sat_name](f'file.{sat_name}')

这种方式更直观,后续维护也方便,比如要调整某个函数的对应关系,直接改字典就行。

为啥你的原代码会报错?

原代码里'ob.rd_'+L只是拼接出了函数的名字字符串,但字符串本身只是一段文本,不是Python里的函数对象。Python不会自动把字符串解析成模块里的成员,必须通过getattr()或者直接引用的方式,才能拿到真正可以被调用的函数对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:56:58