假设我想要一个函数exec_myfunc,它可以执行输入值为10的任何用户定义函数.用户应该用string定义函数,如下所示:

func1_str = """
def myfunc1(x):
    return x
"""

func2_str = """
def myfunc2(x):
    return x**2
"""

现在,我使用了一种非常老套的方法,使用正则表达式提取def (之间的函数名,如下所示:

def exec_myfunc(func_str: str):

    import re
    exec(func_str)
    myfunc_str = re.search(r'def(.*)\(', func_str).group(1).strip()
    return eval(myfunc_str)(10)

print(exec_myfunc(func1_str))
# 10
print(exec_myfunc(func2_str))
# 100

我想知道这样做的一般和正确的方法是什么?

推荐答案

您可以直接使用exec:

def exec_myfunc(func_str: str):
    fun = {} # to hold your function
    exec(func_str,fun)
    fun_name = list(fun.keys())[1]
    fn = fun[fun_name]
    print(f"The function {fun_name} evaluated at 10 = {fn(10)}")
    
exec_myfunc(func1_str)
The function myfunc1 evaluated at 10 = 10

Python相关问答推荐

如果条件为真,则Groupby.mean()

连接两个具有不同标题的收件箱

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

对所有子图应用相同的轴格式

如何在Raspberry Pi上检测USB并使用Python访问它?

如果值发生变化,则列上的极性累积和

pandas:排序多级列

合并帧,但不按合并键排序

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

如何在BeautifulSoup/CSS Select 器中处理regex?

使用类型提示进行类型转换

如何在Airflow执行日期中保留日期并将时间转换为00:00

我怎么才能用拉夫分拣呢?

分解polars DataFrame列而不重复其他列值

查找查找表中存在的列值组合

随机森林n_估计器的计算

正在try 让Python读取特定的CSV文件

递归链表反转与打印语句挂起

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError