需求
需要写个API,实现接收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
高级用法
- 动态创建函数
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
- 动态生成类
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"
- 动态导入模块
eval和exec还可以用于动态导入模块。例如,可以根据用户的输入导入不同的模块:module_name = input("请输入要导入的模块名称:") try: module = __import__(module_name) print(f"成功导入模块 {module_name}") except ImportError: print(f"无法导入模块 {module_name}") ```
- 计算数学表达式
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() 来获取变量的值。