如果我先向您展示我的代码,那可能是最简单的:
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()
。
答案 0 :(得分:1)
100分中99.99次,exec
/ eval
是错误的解决方案。
Python函数(以及方法,类和模块FWIW)是对象,因此如果您可以使self.whatDoes
指向函数(或方法或任何可调用对象),那么您不需要{ {1}}或exec
- 您可以使用预期参数应用调用运算符,即:
eval
如果您需要def fun(obj):
print(obj)
class Whatever(object):
pass
w = whatever()
w.whatDoes = fun
w.whatDoes(42)
成为字符串,请构建whatDoes
个允许的函数名称 - &gt;功能和查找dict:
dict
哦,是的,如果&#34; whatDoes&#34;应该是您班级方法的名称,您可以使用def fun(obj):
print(obj)
FUNCTIONS = {
"fun": fun,
# etc
}
class Whatever(object):
def requestTarget(self):
return 42
def use(self):
target = self.requestTarget()
func = FUNCTIONS[self.whatDoes]
return func(target)
w = Whatever()
w.whatDoes = "fun"
w.use()
答案 1 :(得分:0)
解决方案:将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)
,目标仍然引用该对象。
答案 2 :(得分:-1)
首先使用eval创建函数并调用它。
error: src refspec master does not match any.
error: failed to push some refs to 'https://my_account@bitbucket.org/my_account/my_project.git'