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

时间:2018-06-21 20:59:04

标签: python python-3.x arguments parameter-passing python-multithreading

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

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。反正我能克服这个问题吗?

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

2 个答案:

答案 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()