2011-06-20 92 views
7

我有下面的代碼,它使用了eval功能: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被定義,並且被評估的語句看起來是正確的。

+3

這是一個壞主意。如果需要按字符串存儲值,請使用「dict」,不要動態創建變量。這至少與簡單的一樣,不會影響你的範圍,不需要關聯潛在的安全風險,更難以破解(例如,它可能會導致語法錯誤),性能更好等等。 - 它更好,而且由於那個大魔頭。 (這與函數式編程沒有任何關係。) – delnan

+0

@delnan:我使用這樣的變量的原因是我想讓類的用戶以class.variable的形式訪問變量,而不是必須做class.dict ['variablename']。 – robintw

+6

你可以通過在類中添加一個'__getattr__'方法來實現。 –

回答

10

改爲使用exec,它會對語句進行評估。

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

7

eval()評估表達式。 Python中的賦值是一個聲明。這不起作用。