Python3 将 *args 和 **kwargs 传递给 threading.Timer() 和函数时遇到问题

Python3 having problems passing *args and **kwargs to a threading.Timer() and a function

出于某种原因,我无法将 *args 和 **kwargs 传递给 threading.Timer() 和函数...这是我遇到问题的代码;

from threading import Timer

def print_me(text='foo'):
    print(text)

def repeat_task(delay, action, *args, **kwargs):
    Timer(delay, repeat_task, (delay, action, [*args], {**kwargs}).start()
    action(*args, **kwargs)

repeat_task( 5, print_me, text='bar' )

如果有人能指出我正确的方向,我将不胜感激。 :)

[*args]{**kwargs} 都是无效语法。 kwargs已经是一个dict,所以如果你想把它当成dict,直接用就行了。 args是一个tuple,所以如果你想把它的值作为一个元组,直接使用就可以了,如果你因为某些原因想把它变成一个list,你可以使用list(args).

您正在将这些参数传递给 Timer()whose parameters are defined as

Timer(interval, function, args=None, kwargs=None)

注意那里没有 *s:这个构造函数的 argskwargs 参数是 normal 参数。

所以你的第三个参数需要是你所有的位置参数:delayaction,然后是 args 的所有内容。一种方法是将列表与 +:

一起添加
[delay, action] + list(args)

而您的第四个参数需要是关键字参数,即 kwargs.

所以这应该有效:

Timer(delay, repeat_task, [delay, action] + list(args), kwargs).start()