2012-11-13 86 views
0

我正在做一個戰鬥幫手d & D.我打算使它獲得每個怪物的統計從一個txt文件格式如下:獲得自我屬性

_Name of monster_ 
HP = 45 
AC = 19 
Fort = -3 

我正在使用名爲Monster的類,並且__init__會遍歷.txt文件。它迭代正常,我的問題是,我不能讓變量在它之前有self.Monsterfind()只是找到怪物.txt文件的路徑,我知道這不是問題,因爲變量打印的很好。

class Monster: 
    def __init__(self, monster): 
     """Checks if the monster is defined in the directory. 
     If it is, sets class attributes to be the monster's as decided in its .txt file""" 
     self.name = monster.capitalize() 
     monstercheck = self.monsterfind() 
     if monstercheck != Fales: 
      monsterchck = open(monstercheck, 'r') 
      print monstercheck.next() # Print the _Name of Monsters, so it does not execute 
      for stat in monstercheck: 
       print 'self.{}'.format(stat) # This is to check it has the correct .txt file 
       eval('self.{}'.format(stat)) 
      monstercheck.close() 
      print 'Monster loaded' 
     else: # if unfound 
      print '{} not found, add it?'.format(self.name) 
      if raw_input('Y/N\n').capitalize() == 'Y': 
       self.addmonster() # Function that just makes a new file 
      else: 
       self.name = 'UNKNOWN' 

它只是說:self.AC = 5SyntaxError: invalid syntax @ the equals sign

如果我的同班同學或者我__init__任何問題,哪怕是不重要的,請告訴我,因爲這是我第一次使用類。

預先感謝您

回答

3

你不需要eval()(或exec)這裏(他們應該幾乎從來不使用) - Python有setattr(),這你想要做什麼。

注意,這可能是更容易使用已存在的數據格式,如JSON,避免手動解析它。

至於另注,在處理文件時,最好使用上下文管理器,因爲它讀很好,並確保文件被關閉,即使有一個例外:

with open(monstercheck, 'r') as monsterchck: 
     print monstercheck.next() 
     for stat, value in parse(monstercheck): 
      setattr(self, stat, value) 

顯然,你需要在這裏做一些真正的解析。

由@Lattyware提到
+0

解析不會太棘手。只是'pre_stat,PRE_VALUE = line.split( '=')',然後'STAT = pre_stat.strip()'和'值= ast.literal_eval(PRE_VALUE)','但json'可能更容易 – mgilson

+0

@mgilson不,但使用現有工具可能更容易,除非輸入格式很重要。 –

+0

非常感謝你!所以要進一步詢問,但是JSON的一些好文檔在哪裏,因爲我不熟悉它。格式對我來說並不重要,所以我會研究JSON。另外,除了不需要手動解析外,還有哪些主要優點?再次感謝你的幫助! – Timidger

-1

,你真的應該使用setattr這一點。我將簡單討論爲什麼代碼會產生錯誤。 eval不起作用的原因是因爲它評估表達式並且賦值不是表達式。換句話說,你傳遞給eval什麼應該只是等式的右邊:

eval("a = 5") 

這失敗就像你的代碼。

exec "a = 5" #exec("a = 5") on py3k 

但同樣,這是不明智的:

你可以使用evalexec改變。

+0

謝謝你的解釋,我一定會記住這一點。 – Timidger