如何将元组值作为参数发送给作为线程启动的函数?

3

我有一个类函数,想将其作为线程启动。该函数以元组值作为参数。该函数可以正常工作,但我的初始设置会抛出TypeError。以下是一些示例代码:

import threading

class Test:
    def __init__(self):
        t = threading.Thread(target=self.msg, args=(2,1))
        t.start()
        print "started thread"

    # msg takes a tuple as its arg (e.g. tupleval = (0,1))
    def msg(self,tupleval):
        if(tupleval[0] > 1):
            print "yes"
        else:
            print "no"


test = Test()
test.msg((2,2))
test.msg((0,0))

然后输出结果如下:
started thread
yes
no
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 484, in run
    self.__target(*self.__args, **self.__kwargs)
TypeError: msg() takes exactly 2 arguments (3 given)

看起来这对最后两个显式调用有效,但是初始设置调用会抛出TypeError。我尝试过以各种方式将值打包成元组,但无法摆脱错误。有什么想法吗?

2个回答

6

args接受一个元组作为参数传递给函数。当你使用args=(2,1)时,你并不是在告诉它用一个参数(2,1)来调用msg函数;你是在告诉它用两个参数21来调用。

你需要使用args=((2,1),)


1

这看起来可能很丑,但我相信应该是args=((2,1),)(或者args=[(2,1)]可能看起来稍微好看一些)。

args应该是函数的所有参数的元组,因此要传递元组,您需要一个元组的元组。此外,Python要求您为具有一个元素的元组添加额外的逗号,以将其与仅用括号包装表达式区分开来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接