线程异常:线程目标接受的参数比给定的多
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.
我正在尝试 运行 在 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.