如何在python中为eval函数的输出赋值

时间:2014-04-07 04:57:35

标签: python eval evaluation

我尝试为eval函数的输出分配一些值,如下所示:

d = {"a": 10}
st1 = 'd'
st2 = '["a"]'
eval(st1 + st2) = 15

我收到了这个错误:

File "<stdin>", line 1
SyntaxError: can't assign to function call

我也试过这个:

x = eval(st1 + st2)
x = 15

但它不会改变d字典。我尝试eval这样的整个作业:

eval(st1 + st2 + ' = 15')

但我收到了这个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
  d["a"] = 15
         ^
SyntaxError: invalid syntax

我也试过使用ast.literal_eval()函数,所有结果都是一样的。所以,任何想法怎么做??

编辑1:

为了澄清@LennartRegebro的要求,我应该说我有一些带有一些特定键和值对的字典。我有一个文本文件,我从用户那里获得,其中一些值是在那里定义的,我应该将基本的词典值更改为这些用户定义的值。我有解析文本文件的解析器,每次更改时,它都会给我一个包含字典名称,键和值的元组;都是字符串。我希望通过eval函数进行分配,我知道我不能这样做。

编辑2:

正如@lejlot建议的那样,我使用了globals()并将以下行添加到我的代码中:

import re
pattern = re.compile(r'\["([A-Za-z0-9_\./\\-]+)"\]')
globals()[st1][pattern.findall(st2)[0]] = 15

2 个答案:

答案 0 :(得分:3)

为什么不通过globals()(或locals())代替eval来访问您的变量?

d={'a':10}
globals()['d']['a']=15
print d['a']

在您的特定情况下

d={'a':10}
s1='d'
s2='a'
globals()[s1][s2]=15
print d['a']

答案 1 :(得分:0)

做一个简单的,

exec(st1 + st2 + '= 15')

eval无效。请改用exec。这也应该在论证本身内部完成。

尽管使用exec是一种非常不受推荐的做法。