以元编程方式使用eval为变量赋值

问题描述

我想以元编程方式使用eval为变量赋值。我的尝试如下所示:

sample = None
var_name = "sample"
value = 0
eval("{0} = {1}".format(var_name,value))

但是,出现以下错误

Traceback (most recent call last):
  File "tmp.py",line 4,in <module>
    eval("{0} = {1}".format(var_name,value))
  File "<string>",line 1
    sample = 0
           ^
SyntaxError: invalid Syntax

您能解释一下我该怎么做吗?我认为可能存在像assign(var,val)这样的较低级别的函数,并且可以使用eval启用此分配。但是我找不到这种功能

解决方法

改为使用exec

sample = None
var_name = "sample"
value = 0
exec("{0} = {1}".format(var_name,value))

eval用于计算表达式,而不是赋值语句

,

exec完成了您想做的事情吗?:

<div class="wrapper">
  <input type="text" value="20-123" class="box top">
  <div class="box underlayer">20-123-20</div>
</div>

输出:sample = None var_name = "sample" value = 5 exec(f"{var_name} = {value}") print(sample)

,

如果您不在某个功能范围内,可以使用

globals()[varname] = value

示例:

>>> a
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
NameError: name 'a' is not defined
>>> globals()['a'] = 5
>>> a
5

在函数内部有locals(),但是它只能从符号表中读取而不能更新,因此您应该像其他答案指出的那样使用eval()

您还可以通过在对象上使用setattr / hasattr / getattr作弊:

>>> class Object:
...     pass
... 
>>> obj = Object()
>>> obj.a
Traceback (most recent call last):
  File "<stdin>",in <module>
AttributeError: 'Object' object has no attribute 'a'
>>> setattr(obj,'a',3)
>>> obj.a
3