如何将 eval() 函数与变量列表一起使用?

How to use eval() function with a list of variables?

我有一个字符串形式的函数列表:

["y + x + 3", "x**2 + y**2 - 17"]  # 2 functions in list

我有一个 Sympy Symbol 对象(基本变量)的列表,其 .name 属性与函数字符串中的变量名称对应:

[Symbol(x), Symbol(y)]
# list element 0's .name attribute is "x" 

我发现 Python 有一个名为 eval() 的简洁函数,它可以计算字符串,例如:

x = 1
eval("x + 3") # Result should be 4

基本上这就是我想用我的函数字符串做的。但是,由于这是一个动态实现,所以我没有在程序中 eval() 上方的一行定义变量,而是在列表中。例如,在上面的例子中x被定义为1,那么eval()函数就可以使用它。

但是我的变量在一个列表中,没有定义为函数范围内的变量。 如何使用 eval() 函数并利用我的变量列表?

这个怎么样,你可以在你的符号中包含以下替换和评估代码class(通过继承)。

import ast

x = 5
y = 6

function_str = "y + x + 3"
function_str = function_str.replace('x', '{x}')
function_str = function_str.replace('y', '{y}')

print(ast.literal_eval(function_str.format(x=x, y=y)))
# 14

永远记住使用 eval 是 "EVAL" 因为你不应该相信传入的字符串,listeral_eval 更安全。

eval 将局部变量作为第三个参数(reference), 所以你可以这样做:

from sympy import Symbol
zs = [Symbol('x'), Symbol('y')]
eval('x+y', None, dict([z.name, z] for z in zs))

但是,也许您应该使用 parse_expr,它是 SymPy 的一部分。

from sympy import Symbol
from sympy.parsing.sympy_parser import parse_expr
zs = [Symbol('x'), Symbol('y')]
parse_expr('x+y', local_dict=dict([z.name, z] for z in zs))

我认为最好的方法是将所有变量添加到 locals。然后您可以在 eval 中按名称引用它们。示例:

symbols = [Symbol(x), Symbol(y)]
locals().update({symbol.name:symbol for symbol in symbols})

eval("x+y") # Should return the value of x+y

查看 eval (expression[, globals[, locals]])

的完整定义

您可以将 globals/locals 替换为 eval

例如

eval("x + 3", {"x":1}) # Result should be 4

How could I use the eval() function and utilize my list of variables?

你有 2 个命名空间,你可以用它们做任何你想做的事。

您可以按照以下方式做一些事情:

import math

symbols = {'sqrt': math.sqrt, 'x': 5, 'y': 6}

func_strings = ["y + x + 3", "x**2 + y**2 - 17", "sqrt(1764)"]

for expression in func_strings:
    result = eval(expression, {'__builtins__': None}, symbols)
    print('{} -> {}'.format(expression, result))

输出:

y + x + 3 -> 14
x**2 + y**2 - 17 -> 44
sqrt(1764) -> 42.0