以元编程方式使用 eval 为变量赋值
assign value to a variable using eval in a metaprogramming manner
我想以元编程方式使用 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
是否完成了您想要做的事情?:
sample = None
var_name = "sample"
value = 5
exec(f"{var_name} = {value}")
print(sample)
输出:5
如果您在函数之外,您可以使用
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()
但它只能从符号 table 中读取而不能更新,因此您应该像其他答案指出的那样使用 eval()
。
您也可以通过在对象上使用 setattr/hasattr/getattr 作弊:
>>> class Object:
... pass
...
>>> obj = Object()
>>> obj.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Object' object has no attribute 'a'
>>> setattr(obj, 'a', 3)
>>> obj.a
3
我想以元编程方式使用 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
是否完成了您想要做的事情?:
sample = None
var_name = "sample"
value = 5
exec(f"{var_name} = {value}")
print(sample)
输出:5
如果您在函数之外,您可以使用
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()
但它只能从符号 table 中读取而不能更新,因此您应该像其他答案指出的那样使用 eval()
。
您也可以通过在对象上使用 setattr/hasattr/getattr 作弊:
>>> class Object:
... pass
...
>>> obj = Object()
>>> obj.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Object' object has no attribute 'a'
>>> setattr(obj, 'a', 3)
>>> obj.a
3