我正在为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__
有任何问题,即使它不重要,请告诉我这是我第一次使用课程。
提前谢谢
答案 0 :(得分: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)
显然,你需要在这里做一些真正的解析。
答案 1 :(得分:-1)
setattr
来实现这个目标。我将简单讨论为什么代码会引发错误。 eval
不起作用的原因是因为它评估表达式而赋值不是表达式。换句话说,传递给eval
的内容应该只是等式的右边:
eval("a = 5")
这就像你的代码一样失败。
您可以使用eval
更改为exec
:
exec "a = 5" #exec("a = 5") on py3k
但是,这是不明智的。