0

我的以下代码适用于 python 2.7+

class Worker(threading.Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None, onCompleteCb=None):
        self.__onCompleteCb = onCompleteCb
        self.__name = name
        super(Worker, self).__init__(group, target, name, args, kwargs, verbose)

    def getName(self):
        return self.__name

    def run(self):
        try:
            super(Worker, self).run()
            if self.__onCompleteCb is not None: self.__onCompleteCb(self.__name)
        except Exception, e:
            if self.__onCompleteCb is not None: self.__onCompleteCb(self.__name, failed=True, exception=e)

但我最近发现我的代码应该支持从 2.4 开始的版本:在上面的代码中,run 被调用但是当它调用时super(Worker, self).run(),我看到以下错误

 TypeError: threadTargMethod() argument after ** must be a dictionary

我应该super在 python 2.4 中以不同的方式调用吗?

解决方案 我必须通过以下方式启动线程:

Worker(target=threadTargMethod, name="thread1", args=(), kwargs={}).start()

在 v2.7 中,我开始以下方式并且它有效

Worker(target=threadTargMethod, name="thread1").start()
4

2 回答 2

1

我建议将您的代码更改为:

class Worker(threading.Thread):
    def __init__(self, group=None, target=None, name=None,
             args=(), kwargs={}, verbose=None, onCompleteCb=None):
        ...
        super(Worker, self).__init__(group=group, target=target, name=name, 
                                     args=args, kwargs=kwargs)

换句话说:

  • kwargs为空 dict设置默认值(与文档匹配 - 您似乎对 2.7 很幸运)

  • 不要包含verbose参数(2.4 或 2.7 不支持 - 不知道那里发生了什么)

  • 明确命名

有了这个改变,你可以继续开始

Worker(target=threadTargMethod, name="thread1").start()

因为kwargs默认情况下会正确设置。

于 2013-02-25T23:02:00.060 回答
0

我必须在 v2.4 中以以下方式启动线程:

Worker(target=threadTargMethod, name="thread1", args=(), kwargs={}).start()

在 v2.7 中,我开始以下方式并且它有效

Worker(target=threadTargMethod, name="thread1").start()
于 2013-02-25T22:47:55.753 回答