如果我先向您展示我的代码,可能会更简单:
def use(self):
target = self.requestTarget()
target = str(target)
exec(self.whatDoes+"("+target+")")
self.requestTarget
返回player
,一个对象。self.whatDoes
是"learnAttack"
。learnAttack()
将一个对象作为其参数,并将一个项附加到目标的列表中。
当我运行此代码时,我得到错误:
learnAttack(<character object at 0x7fda68acf1d0>)
^
SyntaxError: invalid syntax
诚然,我本可以编写得更好,但我已经建立了一个完整的框架,修改代码会涉及到很多我懒得做的工作。你知道吗
很抱歉使用exec()
。你知道吗
100次中的99.99次,
exec
/eval
是错误的解决方案。你知道吗Python函数(以及方法、类和模块FWIW)都是对象,因此如果您可以使
self.whatDoes
指向函数(或方法或任何可调用对象),那么您就不需要exec
或eval
-您只需将call操作符与预期参数一起应用,即:如果需要
whatDoes
成为字符串,则构建一个dict
允许的函数名->;函数并查找该dict:哦,是的,如果“whatDoes”应该是类的方法名,您可以使用
getattr(obj,name)
首先使用eval创建函数并调用它。你知道吗
解决方案:用
exec(self.whatDoes+"(target)")
替换exec(self.whatDoes+"("+target+")")
,并删除行target = str(target)
这里的问题是,当您到达第
target = str(target)
行时,所发生的是变量目标变成了字符串"<character object at 0x7fda68acf1d0>"
。它不再引用原始对象,而是只引用那个字符串,它只是一个字符串。然后,当您的程序到达exec(self.whatDoes+"("+target+")")
时,它会作为learnAttack(<character object at 0x7fda68acf1d0>)
执行,这会导致明显的语法错误,因为运行时会在任何地方导致错误。在建议的修复之后,它执行learnAttack(target)
,目标仍然引用对象。你知道吗相关问题 更多 >
编程相关推荐