如何将列表作为参数传递给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)
答案 0 :(得分:8)
问题很简单:你需要将列表参数nb
作为序列的单个元素传递给threading.Timer()
(我通常使用元组,注意尾随的逗号里面括号):
threading.Timer(12.0, pingstarter, (nb,))
...或,列表
threading.Timer(12.0, pingstarter, [nb])
为什么呢?好吧,threading.Timer()
接受一系列参数和dict
个关键字参数。有关详细信息,请参阅documentation on argument unpacking。
您的列表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'])
因此,您需要将其换成另一个序列。
答案 1 :(得分: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])
不需要更改其他代码。
答案 2 :(得分: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()
答案 3 :(得分:0)
http://docs.python.org/library/threading.html#timer-objects
明确指出使用args + kwargs调用该函数。
class threading.Timer(interval, function, args=[], kwargs={})¶
Create a timer that will run function with arguments args and
关键字参数kwargs,之后 间隔秒已过。
因此您需要将方法定义为
def yourmethod(*args, **kw):
...
并从* args,** kwargs
中获取相关参数