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合作。但也许另一个更好。