2017-01-12 27 views
-4

に関数を呼び出すしようとしています。 self.whatDoes"learnAttack"です。 learnAttack()は、引数としてオブジェクトをとり、ターゲットが持つリストに項目を追加します。 私はこのコードを実行すると、私はエラーを取得:は、私が最初にあなたに私のコードを示した場合、それはおそらく最も簡単でしょうオブジェクト

learnAttack(<character object at 0x7fda68acf1d0>) 
      ^
SyntaxError: invalid syntax 

確かに、私はこれより良いコード化している可能性がありますが、私は全体の枠組みを設定していると、このコードを変更すると、私はあまりにも午前多くの作業を伴うだろう怠け者。

exec()をご使用いただきありがとうございます。

+0

あなたのルーチンに渡したいのですか?オブジェクトの 'str'は、' __str__'メソッドを定義しない限り、そのような出力を返す可能性があります。 –

+8

なぜこれに 'exec'を使っているのですか? –

+4

@ JimFasarakis-Hilliard XY問題。 –

答えて

0

ソリューション:exec(self.whatDoes+"(target)")exec(self.whatDoes+"("+target+")")を交換し、ここでの問題は、あなたが行target = str(target)に達したとき、何が起こることは、変数の目標は、文字列"<character object at 0x7fda68acf1d0>"になることであるということであるラインtarget = str(target)

を削除します。それは元のオブジェクトを参照するのではなく、単に文字列であるその文字列を参照します。その後、あなたのプログラムがexec(self.whatDoes+"("+target+")")になると、learnAttack(<character object at 0x7fda68acf1d0>)として実行されます。これは明らかな構文エラーを引き起こします。実行中はどこでもエラーが発生します。この修正を提案すると、learnAttack(target)が実行され、オブジェクトは引き続きオブジェクトを参照します。

+0

解決策:代わりに 'exec'を使用しないでください。 –

+0

理想的ですが、このチャプルは他のものをむしろ変更しないと言います。したがって、少なくとも –

-1

最初に関数を作成して呼び出すには、evalを使用します。 100、exec/evalのうち

def use(self): 
    target = self.requestTarget() 
    target = str(target) 
    func = eval(self.whatDoes) 
    func(target) 
+0

は 'eval'を使用しないでください。 –

1

99.99回間違ったソリューションです。

Python関数(だけでなく、メソッド、クラスとFWIWモジュール)オブジェクトであるので、あなたは、関数(またはメソッドまたは任意の呼び出し可能オブジェクト)にself.whatDoesポイントを作ることができれば、あなたはexecevalを必要としない - ことができますただすなわち、予想される引数を指定して呼び出し演算子を適用します。

def fun(obj): 
    print(obj) 

class Whatever(object): 
    pass 

w = whatever() 
w.whatDoes = fun 

w.whatDoes(42) 

あなたが文字列であることをwhatDoesが必要な場合は、許可された関数名のdict構築 - のdict>の機能とルックアップ:

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

ああ、はい、あなたのクラスのメソッドの名前を "whatDoes"とすると、ちょうどgetattr(obj,name)

関連する問題