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

2 投票
4 回答
10118 浏览
提问于 2025-04-16 19:53

如何将一个列表作为参数传递给 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'])

因此,你需要把它放在另一个序列中。

撰写回答