0

クラス メソッドを引数として別のクラス メソッドに渡そうとしています。以下は例です...

import time

class MyClass(object):

    def doSomething(self,argument2,argument3):
        print argument2,argument3

    def attemptTenTimes(self,fun,*args):
        attempt = 0
        while True:
            try:
                print 'Number of arguments: %s' % len(*args)
                print args
                output = fun(*args)
                return output
            except Exception as e:
                print 'Exception: %s' % e
                attempt += 1
                time.sleep(10)
                if attempt >= 10: return
                else: continue

MC = MyClass()
MC.attemptTenTimes(MC.doSomething,(MC,'argument2','argument3',))

出力は....

Number of arguments: 3
((<__main__.MyClass object at 0x7f7e6be4e390>, 'argument2', 'argument3'),)
Exception: doSomething() takes exactly 3 arguments (2 given)
Number of arguments: 3
((<__main__.MyClass object at 0x7f7e6be4e390>, 'argument2', 'argument3'),)
Exception: doSomething() takes exactly 3 arguments (2 given)
Number of arguments: 3
((<__main__.MyClass object at 0x7f7e6be4e390>, 'argument2', 'argument3'),)
Exception: doSomething() takes exactly 3 arguments (2 given).............

関数 doSomething に 3 つの引数を渡していますが、この例外が発生し続けます。関数を他の関数の引数として使用したことはありますが、クラスのコンテキスト内で使用するのはこれが初めてです。どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

3 つの引数を渡していません。あなたは2つ合格しました。あなたはこれを必要とします:

MC.attemptTenTimes(MC.doSomething,*('argument2','argument3'))

またはこれ(同等):

MC.attemptTenTimes(MC.doSomething,'argument2','argument3')

このattemptTenTimes関数には、*argsローカルで として参照されるタプルに位置引数を収集するパラメーター がありますargs。タプル全体を唯一の位置引数として渡すので、ローカルには のargsような名前の変数があります((MC,'argument2','argument3'),)。その結果、それを解凍して関数に渡すと、内側のタプルを渡すだけです。

余談ですが、 に渡すときに args をアンパックしないでlenください。エラーがスローされるためです。len(args)そこに12行目を入れたいだけです。

あるいは、attemptTenTimes 関数のシグネチャを次のように変更することもできます。

def attemptTenTimes(self,fun,args):

その後、最初に行っていたように、args タプル全体をそれに渡すことができます。ただし、使用する*args方がより標準的であると思います。個人的には、より明確だと思います。

于 2013-03-27T15:26:28.267 に答える