我需要将一个大的元组和一个变量作为参数传递给线程任务。
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
。反正我能克服这个问题吗?
当我仅将元组作为参数传递时,从未发生过错误。
答案 0 :(得分:4)
首先,要传递一个元组和另一个值,您可以只创建一个具有两个成员的元组-大元组和另一个值。正好在您做的事情:
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()缺少242个必需的位置参数
解决此问题的最简单方法是给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元素元组,该元组现在与方法的参数匹配。
答案 1 :(得分:0)
如果我了解您的问题,则可以在元组之前添加一个星号,以传递未包装的参数:
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()