如何将元组和变量作为参数传递

How to pass tuple and variable as args

我需要将一个大元组和一个变量作为参数传递到线程任务中。

excelbtn_text.set("Outputting...")
excelClass = excelCL()
excel_thread = threading.Thread(target=excelClass.excelOut, args=(dcf_data_tuple, excelbtn_text))
excel_thread.daemon = True
excel_thread.start()

但是我收到一个错误,TypeError: excelOut() missing 242 required positional arguments。无论如何我可以解决这个问题吗?

当我仅将元组作为参数传递时从未发生错误。

如果我理解你的问题,你可以在你的元组前添加一个星号来传递展开的参数:

excelbtn_text.set("Outputting...")
excelClass = excelCL()
excel_thread = threading.Thread(target=excelClass.excelOut, args=(*dcf_data_tuple, excelbtn_text))
excel_thread.daemon = True
excel_thread.start()

首先,要传递一个元组和另一个值,您只需创建另一个具有两个成员的元组——大元组和另一个值。正如您所做的那样:

args=(dcf_data_tuple, excelbtn_text)

但是您传递的参数必须与方法的函数定义相匹配。将 2 个值的有效元组作为方法的参数传递是行不通的,除非该方法采用 2 个参数。


为解决您的困惑,首先,这并不意味着您认为的那样:

args=(dcf_data_tuple)

圆括号不创建元组;逗号创建一个元组。换句话说,(2) 不是包含数字 2 的 1 元素元组,它只是数字 2(dct_data_tuple) 不是包含元组 dct_data_tuple 的 1 元素元组,它只是 dct_data_tuple.

因此,excelClass.excelOut 的函数定义大概是 而不是 一个单一的巨型元组作为参数,而是数百个单独的参数。

这是一个奇怪的设计,但实际上并不违法。

这与您得到的异常相匹配:当您向它传递 2 个参数(第一个是一个巨大的元组)而不是数百个参数时,它会抱怨您缺少 242 个位置参数:

TypeError: excelOut() missing 242 required positional arguments


解决此问题的最简单方法是为 excelOut 提供一个与您要传递的内容相匹配的合理签名:

def excelOut(self, data_tuple, text):
    # do stuff here

如果由于某种原因你不能改变它的定义,那么你必须看看定义是什么,并尝试匹配它。例如,如果它看起来像这样:

def excelOut(self, data0, data1, … hundreds more, …, text):

...然后你必须这样称呼它:

args=dcf_data_tuple + (excelbtn_text,)

注意末尾的逗号。这意味着 (excelbtn_text,) 是一个 1 元素元组。然后我们将巨型元组添加到 1 元素元组并得到一个巨型加 1 元素元组,它现在与方法的参数匹配。