【Python】写函数实现输入Python代码,执行并返回结果(不考虑安全问题)

需求

需要写个API,实现接收python函数代码和入参,返回执行结果。

实现(eval和exec函数)

参考:Python中的eval和exec函数:深度解析两者的区别与使用场景

eval函数
eval函数用于计算传递给它的Python表达式,并返回结果。它通常用于执行单一表达式,并将其结果赋值给变量。eval函数的语法如下:
result = eval(expression)
其中,expression是要计算的Python表达式,而result是eval函数的返回值。

exec函数
exec函数用于执行包含Python代码块的字符串。它通常用于执行多行代码,而不返回任何结果。exec函数的语法如下:
exec(code)
其中,code是包含要执行的Python代码的字符串。


入参:
scripts : str # python函数代码
params: dict # 函数入参

def execute_func(scripts, params):
	exec(scripts)
	func_name = scripts.split("(")[0].split(" ")[-1] # 取出函数名
	result = eval(func_name + "(" + str(params) + ")")
	return result

高级用法

  1. 动态创建函数
    exec函数可以用于动态创建函数。例如,可以根据用户提供的参数来创建一个定制的函数:
    func_name = "multiply"
    params = ["a", "b"]
    code = f"""
    def {func_name}({', '.join(params)}):
        return {params[0]} * {params[1]}
    """
     
    exec(code)
    result = multiply(5, 3)
    print(result)  # 输出15
    
  2. 动态生成类
    exec也可用于动态生成类。例如,可以根据一组属性和方法动态创建一个类:
    class_name = "Person"
    attributes = {"name": "John", "age": 30}
     
    code = f"""
    class {class_name}:
        def __init__(self, {', '.join(attributes.keys())}):
            {', '.join([f'self.{attr} = {attr}' for attr in attributes])}
        def get_info(self):
            return "Name: {}, Age: {}".format({', '.join([f'self.{attr}' for attr in attributes])})
    """
     
    exec(code)
     
    person = Person(attributes["name"], attributes["age"])
    print(person.get_info())  # 输出 "Name: John, Age: 30"
    
  3. 动态导入模块
    eval和exec还可以用于动态导入模块。例如,可以根据用户的输入导入不同的模块:
    module_name = input("请输入要导入的模块名称:")
    try:
        module = __import__(module_name)
        print(f"成功导入模块 {module_name}")
    except ImportError:
        print(f"无法导入模块 {module_name}")
       ```
    
  4. 计算数学表达式
    eval可以用于计算动态生成的数学表达式。这对于实现计算器应用程序或数学公式求值非常有用:
    expression = input("请输入数学表达式:")
    try:
        result = eval(expression)
        print("结果:", result)
    except Exception as e:
        print("输入无效:", e)
    

exec()和eval()的区别

深度辨析 Python 的 eval() 与 exec()-知乎
Python3 exec 函数
Python eval() 函数

eval() 函数用来执行一个字符串表达式,并返回表达式的值。
eval(expression[, globals[, locals]])

参数:

  • expression – 表达式。
  • globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

eval() 函数将字符串 expression 解析为 Python 表达式,并在指定的命名空间中执行它。

返回值:
eval() 函数将字符串转换为相应的对象,并返回表达式的结果。


exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec 可以执行更复杂的 Python 代码。
exec(object[, globals[, locals]])

参数:

  • object:必选参数,表示需要被指定的 Python 代码。它必须是字符串或 code 对象。如果 object 是一个字符串,该字符串会先被解析为一组 Python 语句,然后再执行(除非发生语法错误)。如果 object 是一个 code 对象,那么它只是被简单的执行。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与 globals 相同的值。

返回值:
exec 返回值永远为 None。

如果要获取执行代码后的返回值,可以使用 eval 函数或 exec 结合 locals() 或 globals() 来获取变量的值。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月漫长_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值