如何将List作为参数传递给threading.Timer中的函数

Puj*_*ava 2 python

如何将列表作为参数传递给函数threading.Timer(...)?请参阅以下代码.我想传递nb []作为参数

nb=['192.168.1.2', '192.168.1.3', '192.168.1.4']
ping_thread = threading.Timer(12.0, pingstarter, nb,)
ping_thread.start()
Run Code Online (Sandbox Code Playgroud)

pingstarter是一个函数并将参数作为列表.

我收到以下错误.如果需要,我可以发布所有代码.

谢谢.

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 726, in run
    self.function(*self.args, **self.kwargs)
TypeError: pingstarter() takes exactly 1 argument (3 given)
Run Code Online (Sandbox Code Playgroud)

det*_*tly 8

问题很简单:你需要列表参数传递nbthreading.Timer()作为一个序列的单个元素(我通常使用一个元组,注意后面的逗号内部括号):

threading.Timer(12.0, pingstarter, (nb,))
Run Code Online (Sandbox Code Playgroud)

......或者,一个清单

threading.Timer(12.0, pingstarter, [nb])
Run Code Online (Sandbox Code Playgroud)

为什么?好吧,threading.Timer()接受一系列参数和一个dict关键字参数.有关更多信息,请参阅有关参数解包文档.

您的列表nb被解释为参数序列,而不是单个参数,因此pingstarter最终会被调用为:

pingstarter('192.168.1.2', '192.168.1.3', '192.168.1.4')
Run Code Online (Sandbox Code Playgroud)

...代替:

pingstarter(['192.168.1.2', '192.168.1.3', '192.168.1.4'])
Run Code Online (Sandbox Code Playgroud)

因此,您需要将其包装在另一个序列中.