如何将元组和变量作为参数传递
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 元素元组,它现在与方法的参数匹配。
我需要将一个大元组和一个变量作为参数传递到线程任务中。
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 元素元组,它现在与方法的参数匹配。