线程异常:线程目标接受的参数比给定的多

Exception in thread: thread target takes more arguments than given

我正在尝试 运行 在 on_message 回调时并行进行一些测试。当我的 on_message 回调被调用时,基于一些消息,我创建了一个线程来 运行 一些测试并将其设置为守护线程。我只将一个参数传递给线程中指定的目标方法。即使我只传递一个参数,我也会收到此错误

TypeError: mymethod()takes 2 positional arguments but 10 were given

#callback attached to paho.mqtt.client client.on_message = self.on_message
def on_message(self, client, userdata, msg):
        if  msg.topic.startswith("hello/"):
            #set some vlaues              
        elif msg.topic.startswith("data/"):
            #set some vlaues                                 
        elif msg.topic.startswith("test/"):
            value =  msg.payload.decode("utf-8")  
            lst = value.split('-')
            test = Test()
            test._value = lst[0]
            param = lst[1]
            print (param) #prints one argument e.g. testdata
            t = Thread(target = test.mymethod, args=(param)) # passing one argument  
            t.setDaemon(True)
            t.start()

Exception in thread Thread-2:
 Traceback (most recent call last):
   File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
     self.run()
   File "/usr/local/lib/python3.6/threading.py", line 864, in run
     self._target(*self._args, **self._kwargs)
 TypeError: mymethod() takes 2 positional arguments but 10 were given

args=(param) 并不像人们想象的那样创建一个元组。元组由 , 生成,而不是由 () 生成。

您可以使用 args = (param,) 或仅使用 args = param, 创建一个 one-element 元组(后者在函数调用中不起作用并影响可读性,因此请避免使用它。) .

由于传递给参数的值的格式存在错误 'args'。

args 参数接受元组,因此您应该使用的代码是:

t = Thread(target = test.mymethod, args=(param,))

其中重要的部分是参数后面的逗号,这意味着您需要传递一个序列。

说明

>>> (2)
2
>>> (2,)
(2,)

将某些内容括在括号中将产生与直接传递它相同的结果。这在 multi-line 情况下特别有用。比如分组导入。

所以:

a = (3)
b = 3
a == 3

在你的例子中,你想要传递多个参数。要制作 tuple,结尾的逗号很重要!

所以在你的情况下,你需要逗号 ;)

t = Thread(target = test.mymethod, args=(param)) # param object being passed as args. Guess this has 10 items.
t = Thread(target = test.mymethod, args=(param, )) # passing a tuple with param as first and only item. So passing one args.