2012-11-13 2 views
0

.txt 파일에서 속성 Monster이라는 클래스를 사용 중이며 __init__은 .txt 파일을 반복합니다. iterates 괜찮아요, 내 문제는 그 전에 self. 가지고 변수를 얻을 수 없다는 것입니다. Monsterfind()은 단순히 괴물 .txt 파일에 대한 경로를 찾고 변수가 잘 인쇄되므로 문제가 아님을 알고 있습니다.얻기 자기는 내가이이 형식으로 .txt 파일에서 각 몬스터의 통계를 얻을 수 있도록 할 계획 D & D.에 대한 전투 도우미를 만들고있어

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__에 문제가 중요하지 않은 경우에도이 있으면 말씀해주십시오. 파이썬은 당신이 원하는 않는, setattr()있다 -

당신은 (그들은 거의 사용해서는 안됩니다) 여기 eval() (또는 exec)가 필요하지 않습니다 사전

답변

3

에 감사드립니다.

수동으로 파싱하지 않으려면 JSON과 같이 이미있는 데이터 형식을 사용하는 것이 더 쉽습니다. 또 다른 메모 파일로 작업 할 때 잘 읽고, 폐쇄 된 파일을 보장하므로 예외가있는 경우에도, 상황에 맞는 관리자를 사용하는 것이 가장 좋습니다으로

: 분명히

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

당신 여기서 실제 파싱을해야합니다.

+0

구문 분석이 너무 까다로울 수는 없습니다. 'pre_stat, pre_value = line.split ('=')''stat = pre_stat.strip()'과'value = ast.literal_eval (pre_value)'가 뒤 따르지만'json'은 아마 더 쉬울 것입니다. – mgilson

+0

@mgilson 아니요. 그러나 입력 형식이 중요하지 않으면 기존 도구를 사용하는 것이 더 쉬울 수도 있습니다. –

+0

정말 고마워요! 더 궁금한 점이 있지만, 익숙하지 않은 JSON에 관한 좋은 문서가 어디에 있는가. 형식은 중요하지 않으므로 JSON을 살펴 보겠습니다. 또한, 수동으로 구문 분석 할 필요가없는 것 외에 다른 주요 장점은 무엇입니까? 도와 주셔서 다시 한 번 감사드립니다! – Timidger

-1

@Lattyware에서 언급했듯이이 경우 setattr을 사용해야합니다. 나는 단지 을 논의 할 것이고 코드가 오류를 일으킨다. eval이 작동하지 않는 이유는 표현식을 평가하고 할당이 표현식이 아니기 때문입니다.

eval("a = 5") 

이 당신의 코드처럼 실패 : 다른 말로하면, 당신은 eval에 전달 것만 방정식의 오른쪽해야한다. 다시 병이 좋습니다

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

그러나 :

당신은 evalexec에 사용에서 변경 될 수 있습니다.

+0

설명해 주셔서 감사합니다. 저는 명심해야 할 것입니다. – Timidger