0

D&D のコンバット ヘルパーを作成しています。次の形式の .txt ファイルから各モンスターの統計情報を取得する予定です。

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

というクラスを使用しており、.txt ファイルMonsterを反復処理します。__init__それは問題なく繰り返されます。私の問題は、その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 = 5 SyntaxError: invalid syntax @ the equals sign

私のクラスや私__init__の .

前もって感謝します

4

2 に答える 2

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)

明らかに、ここで実際の解析を行う必要があります。

于 2012-11-13T15:15:25.990 に答える
-2

@Lattywareで述べたように、これには本当に使用setattrする必要があります。コードでエラーが発生する理由について簡単に説明します。機能しない理由evalは、式を評価し、代入が式ではないためです。言い換えれば、あなたが渡すものevalは方程式の右辺だけであるべきです:

eval("a = 5")

これはあなたのコードと同じように失敗します。

使用evalからexec次のように変更できます。

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

しかし、これもお勧めできません。

于 2012-11-13T15:20:07.367 に答える