我有一个类功能,我想作为一个线程启动。该函数将元组值作为参数。该函数工作正常但我的初始设置抛出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。我已经尝试过以各种方式将值打包到元组中,但无法摆脱错误。想法?
答案 0 :(得分:5)
args
将一个参数元组传递给函数。当您说args=(2,1)
时,您没有告诉它使用单个参数msg
来呼叫(2,1)
;你告诉它用两个参数2
和1
来调用它。
您想要args=((2,1),)
。
答案 1 :(得分:1)
这看起来很难看,但我认为它应该是args=((2,1),)
(或args=[(2,1)]
可能看起来更好一点。)
args
应该是函数的所有参数的元组,所以要传递一个元组,你需要一个元组的元组。此外,Python要求您为元组添加额外的逗号,并使用一个元素将其与仅用括号括起表达式区分开来。