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

时间:2011-06-20 04:12:49

标签: 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()

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 个答案:

答案 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

中获取相关参数