如何将列表作为参数传递给threading.Timer中的函数
如何将一个列表作为参数传递给 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()
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)
4 个回答
1
这是我的回答
nb=['192.168.1.2', '192.168.1.3', '192.168.1.4']
ping_thread = threading.Timer(12.0, pingstarter, (nb,))
ping_thread.start()
1
试着把你的 pingstarter
放在另一个函数里:
def wrapper:
nb = ['', '', '']
pingstarter(nb)
ping_thread = threading.Timer(12.0, wrapper)
或者,你可以重新定义 pingstarter
,让它能接受传入的参数格式。不要用这样的方式:
def pingstarter(nb):
可以尝试这样做:
def pingstarter(*nb):
这样做的效果是把所有传给 pingstarter
的参数合并成一个元组,这个元组被称为 nb
。这样就解决了 Timer 调用 pingstarter(*nb)
而不是 pingstarter(nb)
的问题。
最后,你可以给 threading.Timer
传一个只包含一个元素的列表,这个元素就是你想传递的列表:
ping_thread = threading.Timer(12.0, pingstarter, [nb])
这样做不需要改动你其他的代码。
10
这个问题很简单:你需要把列表参数 nb
作为一个序列的单个元素传给 threading.Timer()
(我通常使用元组,注意括号内要有一个结尾的逗号):
threading.Timer(12.0, pingstarter, (nb,))
...或者,使用一个列表
threading.Timer(12.0, pingstarter, [nb])
为什么呢?因为 threading.Timer()
接受一系列参数和一个关键字参数的字典。想了解更多信息,可以查看关于参数解包的文档。
你的列表 nb
被当作参数序列来处理,而不是作为一个单独的参数,所以 pingstarter
最终会被调用成:
pingstarter('192.168.1.2', '192.168.1.3', '192.168.1.4')
...而不是:
pingstarter(['192.168.1.2', '192.168.1.3', '192.168.1.4'])
因此,你需要把它放在另一个序列中。