如何编写一个将另一个函数及其参数作为输入的函数,在线程中运行它并在执行后销毁线程?

How to write a function that takes another function and its arguments as input, runs it in a thread and destroys thread after execution?

我正在尝试在 micropython 中编写一个函数,它采用另一个函数的名称以及参数和关键字参数,为 运行 该函数创建一个线程,并在函数 [=35] 之后自动退出线程=].

要求是在这个线程中必须是 运行 的函数可能根本没有 arguments/keyword 个参数,或者可能有可变数量的参数。

到目前为止,我尝试了:

import _thread

def run_main_software():
    while True:
        pass


def run_function(function, arguments, kwarguments):
    def run_function_thread(function, args, kwargs):
        function(*args, **kwargs)
        _thread.exit()

    _thread.start_new_thread(run_function_thread, (function, arguments, kwarguments))


_thread.start_new_thread(run_main_software, ())


def test_func(thingtoprint):
    print(thingtoprint)

但是,当我尝试 运行 这个时,我得到:

>>> run_function(test_func, "thingtoprint")
>>> Unhandled exception in thread started by <function run_function_thread at 0x2000fb20>
Traceback (most recent call last):
  File "<stdin>", line 44, in run_function_thread
AttributeError: 'NoneType' object has no attribute 'keys'

如果我传递所有三个参数:

>>> run_function(test_func, "Print this!", None)
>>> Unhandled exception in thread started by <function run_function_thread at 0x20004cf0>
Traceback (most recent call last):
  File "<stdin>", line 48, in run_function_thread
TypeError: function takes 1 positional arguments but 11 were given

我在这里做错了什么?

谢谢!

编辑:根据 Giacomo Alzetta 的建议,我尝试使用 ("Print this!", ) 运行,我得到了这个:

>>> run_function(test_func, ("Print this!", ), None)
>>> Unhandled exception in thread started by <function run_function_thread at 0x20003d80>
Traceback (most recent call last):
  File "<stdin>", line 44, in run_function_thread
AttributeError: 'NoneType' object has no attribute 'keys'

编辑 2:如果我这样做就有效:

>>> run_function(test_func, ("Print this!", ), {})
>>> Print this!

问题是在第一种情况下,我缺少一个 non-optional 参数 (kwarguments)。所以 **kwargs 找不到任何要迭代的键,导致错误:

AttributeError: 'NoneType' object has no attribute 'keys'

在第二种情况下,我明确地将 None 传递给 **kwargs 而不是字典。然而,在这里,它注意到我向 *args 传递了一个字符串而不是一个元组。所以 *args 本质上是遍历字符串并将字符串中的每个字符作为不同的参数。这导致:

TypeError: function takes 1 positional arguments but 11 were given

在第三种情况下,我确实将一个元组传递给*args,但错误与第一种情况基本相同。

解决方案是将元组传递给 *args,将空字典传递给 **kwargs,如下所示:

>>> run_function(test_func, ("Print this!", ), {})
>>> Print this!