【问题标题】:eval giving syntax error even when correct code given即使给出正确的代码,eval 也会给出语法错误
【发布时间】:2014-08-21 06:40:39
【问题描述】:

我有以下代码,它使用eval 函数:

lines = self.fulltext.splitlines()

CURRENT = 0

extractors = { "solar zenith angle" : (CURRENT, 1, "self.solar_z"),
                       "ground pressure" : (CURRENT, 2, "self.ground_pressure")                     

             }

print locals()

for line in lines:
    for label, details in extractors.iteritems():
        if label in line:
            if details[0] == CURRENT:
                values = line.split()
                eval("%s = values[%d]" % (details[2], details[1]))

但是,当我运行它时,我收到以下错误:

eval("%s = values[%d]" % (details[2], details[1]))
  File "<string>", line 1
    self.solar_z = values[1]
                 ^
SyntaxError: invalid syntax

这是为什么? self.solar_z 已定义,经过 eval 的语句看起来是正确的。

【问题讨论】:

  • 这是个坏主意。如果您需要按字符串存储值,请使用dict,不要动态创建变量。它至少很简单,不会与 your 范围相混淆,不必关联潜在的安全风险,更难破解(例如,它不可能产生语法错误)表现更好,等等 - 它只是更好,而且在很大程度上。 (这与函数式编程无关。)
  • @delnan:我使用这样的变量的原因是我想允许类的用户以 class.variable 的形式访问变量,而不是必须做 class.dict[ '变量名']。
  • 你可以通过在类中添加一个__getattr__方法来做到这一点。

标签: python eval


【解决方案1】:

改用exec,它确实评估语句,to。

exec "self.solar_z = values[1]" in locals(), locals()

【讨论】:

    【解决方案2】:

    eval() 计算表达式。 Python 中的赋值是一个语句。这行不通。

    【讨论】:

      最近更新 更多