我试图在on_message回调上并行运行一些测试。当我的on_message回调被调用时,根据一些消息,我创建一个线程来运行一些测试并将其设置为守护线程。我只传递一个参数到线程中指定的目标方法。即使我只传递一个参数,我也会收到此错误
TypeError:mymethod()需要2个位置参数,但是给出了10个
#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
答案 0 :(得分:4)
由于传递给参数'args'的值的格式,存在错误。
args参数接受元组,因此您应该使用的代码是:
t = Thread(target = test.mymethod, args=(param,))
这一点的重要部分是param之后的逗号,这意味着你需要传递一个序列。
解释
>>> (2)
2
>>> (2,)
(2,)
答案 1 :(得分:1)
args=(param)
不会创建一个元组。元组由,
生成,而不是由()
生成。
您可以使用args = (param,)
或仅使用args = param,
创建单元素元组(后者在函数调用中不起作用并影响可读性,因此请避免使用它。)。
答案 2 :(得分:1)
在括号中包装内容会产生与直接传递相同的内容。这在多线情况下尤其有用。如分组导入。
所以:
a = (3)
b = 3
a == 3
在您的情况下,您希望传递args,如多个。要创建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.