试图在一个对象上调用一个函数

时间:2017-01-12 18:38:39

标签: python function python-3.x oop

如果我先向您展示我的代码,那可能是最简单的:

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()

3 个答案:

答案 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'