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,但是,这个异常不断出现。我以前使用函数作为其他函数的参数,但这是我第一次在类的上下文中这样做。任何帮助,将不胜感激。谢谢。

4

1 回答 1

1

你还没有通过三个参数;你通过了两个。你需要这个:

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

或这个(等效):

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

attemptTenTimes函数具有参数*args,它将位置参数收集到本地称为 的元组中args。您将整个元组作为唯一的位置参数传递给它,因此在本地您有一个args名为((MC,'argument2','argument3'),). 结果,当您将其解包并将其传递给您的函数时,您只是传递了内部元组。

顺便说一句,你也不应该在将 args 传递给 args 时对其进行解包len,因为这会引发错误。你只需要len(args)在上面的 12 号线。

或者,您可以将您的尝试TenTimes 函数签名更改为:

def attemptTenTimes(self,fun,args):

然后,您可以将整个 args 元组传递给它,就像您最初所做的那样。不过,我相信使用*args更标准,而且我个人认为它更清晰。

于 2013-03-27T15:26:28.267 回答