Python 如何在变量列表中使用eval()函数?

Python 如何在变量列表中使用eval()函数?,python,eval,Python,Eval,我有一个函数列表作为字符串: ["y + x + 3", "x**2 + y**2 - 17"] # 2 functions in list 我有一个Sympy Symbol对象列表,基本上是变量,其名称属性响应函数字符串中的变量名称: [Symbol(x), Symbol(y)] # list element 0's .name attribute is "x" 我发现Python有一个名为eval的简洁函数,可以计算字符串,例如: x = 1 eval("x + 3") # Resu

我有一个函数列表作为字符串:

["y + x + 3", "x**2 + y**2 - 17"]  # 2 functions in list
我有一个Sympy Symbol对象列表,基本上是变量,其名称属性响应函数字符串中的变量名称:

[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函数并利用变量列表?

如何,您可以在符号类中包装以下替换和eval代码(通过inheriate)

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\u eval更安全。

这样如何,您可以在符号类中包装以下替换和eval代码(通过inheriate)

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\u eval更安全。

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

from sympy import Symbol
zs = [Symbol('x'), Symbol('y')]
eval('x+y', None, dict([z.name, z] for z in zs))
然而,也许你应该使用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))
eval将局部变量作为第三个参数, 所以你可以这样做:

from sympy import Symbol
zs = [Symbol('x'), Symbol('y')]
eval('x+y', None, dict([z.name, z] for z in zs))
然而,也许你应该使用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))

在我看来,最好的方法是将所有变量添加到局部变量中。然后可以在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中按名称引用它们。例如:

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上替换全局/局部

例如

如何使用eval函数和变量列表


您有两个名称空间,可以使用它们执行任何操作。

查看名称空间的完整定义

您可以在eval上替换全局/局部

例如

如何使用eval函数和变量列表


您有两个名称空间,可以使用它们执行任何操作。

您可以按照以下方式执行操作:

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 sqrt1764->42.0
您可以按照以下思路做一些事情:

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 sqrt1764->42.0
明确声明不应更新字典局部变量返回,因为这样做不可靠。明确声明不应更新字典局部变量返回,因为这样做不可靠。我将查看parse_expr方法。现在我有你的建议与eval合作。但也许另一个更好。我来看看parse_expr方法。现在我有你的建议与eval合作。但也许另一个更好。