Python中如何将字符串列表转换为可调用函数列表
字符串函数名转可调用函数的实现方法
最安全也最可控的是手动建立映射字典,避免执行不可信的外部代码,非常适合你从外部邮件爬取内容的场景:
方案1:手动建立函数映射字典(推荐)
# 先定义你需要用到的对应函数 def SU(): # SU对应的业务逻辑 return "SU函数执行结果" def BT(): # BT对应的业务逻辑 return "BT函数执行结果" def PL(): # PL对应的业务逻辑 return "PL函数执行结果" # 建立字符串名到函数实体的映射关系 func_mapping = { "SU": SU, "BT": BT, "PL": PL }
匹配到字符串后直接从字典中取出可调用的函数实体即可:
a = ['SU', 'BT', 'PL'] s = 'sdf sghf sdfgdf SU agffg PL asu' matches = [x for x in a if x in s] # 转换为可调用函数列表 callable_funcs = [func_mapping[item] for item in matches] # 直接调用测试 for func in callable_funcs: print(func())
方案2:从全局命名空间获取
如果不想手动维护映射字典,也可以直接从当前全局命名空间中拉取对应名称的函数,注意该方案安全性低于方案1,需确保匹配到的字符串都是合法的函数名:
callable_funcs = [globals()[item] for item in matches]
方案3:类内方法场景用getattr
如果你的函数是某个类的成员方法,使用getattr获取即可:
class ToolFunc: def SU(self): return "类方法SU执行" def BT(self): return "类方法BT执行" def PL(self): return "类方法PL执行" tool = ToolFunc() callable_funcs = [getattr(tool, item) for item in matches]
注意事项
- 禁止使用
eval()实现该需求,你爬取的内容来自外部邮件,属于不可信输入,eval()会直接执行传入的任意代码,存在极大安全风险 - 你示例中返回的
['SU', 'BL']存在逻辑问题,BL并不在你的初始函数名列表a中,实际运行原代码不会匹配到BL,大概率是拼写错误。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

