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 = 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")

这就像您的代码一样失败。

您可以从 using 更改evalexec

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

但这又是不明智的。

于 2012-11-13T15:20:07.367 回答