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
相关产品推荐
相关产品推荐

