如何将pandas dataframe处理函数的字符串列表转为可调用对象执行
你之前使用的classthing封装方案仅对字符串做了对象包裹,没有绑定实际的函数逻辑,无法直接调用执行处理。可参考以下方案实现需求:
方案1:手动维护函数映射表(最安全,推荐)
提前把允许调用的处理函数和对应的字符串名称做映射,仅放行合法函数,避免代码注入风险,适配所有运行场景。
import pandas as pd # 1. 定义你的所有处理函数,建议统一返回处理后的DataFrame,避免inplace修改的隐性问题 def func2(df): df = df.copy() # 可选配置:加这行可以避免修改原始DataFrame df['ID_NUM'] = 'A' + df['TAIL'].str[-9:] return df def func4(df): df = df.copy() # 补充你的func4处理逻辑 return df def func5(df): df = df.copy() # 补充你的func5处理逻辑 return df # 2. 你的字符串格式函数列表 func_list = ['func2', 'func4', 'func5'] # 3. 建立合法函数映射表 func_mapping = { 'func2': func2, 'func4': func4, 'func5': func5 } # 4. 把字符串列表转为可调用对象列表,同时过滤非法函数名 callable_funcs = [func_mapping[name] for name in func_list if name in func_mapping] # 5. 批量处理DataFrame df = pd.read_csv("你要处理的文件路径.csv") for func in callable_funcs: df = func(df)
方案2:通过全局命名空间获取(仅推荐函数名来源可信的场景)
如果你的函数都是全局定义的,且函数列表来源完全可控,不需要手动维护映射表,可以直接从globals()中获取对应函数:
callable_funcs = [] for func_name in func_list: # 校验目标名称存在且是可调用对象 if func_name in globals() and callable(globals()[func_name]): callable_funcs.append(globals()[func_name]) # 后续批量处理逻辑和方案1一致 df = pd.read_csv("你要处理的文件路径.csv") for func in callable_funcs: df = func(df)
注意:该方案存在代码注入风险,禁止在函数名由用户自由输入的场景使用
内容的提问来源于stack exchange,提问作者Kyle Quigley
相关产品推荐
相关产品推荐

