问题描述
我想以元编程方式使用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