如何在Python中获取exec()定义的可调用函数?

How to get the callable function defined by exec() in Python?

提问人:Shaun Han 提问时间:10/11/2023 最后编辑:Shaun Han 更新时间:10/11/2023 访问量:37

问:

假设我想要一个函数,该函数可以执行任何输入值为 10 的用户定义函数。用户应该通过字符串定义函数,如下所示:exec_myfunc

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

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

python-3.x 字符串 函数 exec

评论


答:

2赞 Andrej Kesely 10/11/2023 #1

你可以使用 ast 模块解析 python 字符串,然后找到函数名称:

import ast

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

parsed_func = ast.parse(func1)

for node in ast.walk(parsed_func):
    if isinstance(node, ast.FunctionDef):
        function_name = node.name
        break

print("Function name:", function_name)

指纹:

Function name: myfunc1
1赞 Onyambu 10/11/2023 #2

您可以直接使用: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