Python 如何将元组和变量作为参数传递
我需要将一个大元组和一个变量作为参数传递到一个线程任务中Python 如何将元组和变量作为参数传递,python,python-3.x,arguments,parameter-passing,python-multithreading,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() 但是,我收到一个错误,TypeE
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()缺少242个必需的位置参数
。我能克服这个问题吗
当我仅将元组作为参数传递时,从未发生过错误。如果我了解您的问题,您可以在元组前添加星号以传递展开的参数:
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()
如果我理解您的问题,您可以在元组前添加一个星号来传递展开的参数:
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
的单元素元组,它只是数字2
。而(dct\u data\u tuple)
不是一个包含元组dct\u data\u tuple
的单元素元组,它只是dct\u data\u 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,)
…那么你必须这样称呼它:
def excelOut(self, data0, data1, … hundreds more, …, text):
args=dcf_data_tuple + (excelbtn_text,)
注意结尾的逗号。这意味着
(excelbtn_text,)
是一个单元素元组。然后我们将巨元组添加到1元素元组中,并返回一个巨元组加1元素元组,该元组现在与方法的参数匹配。首先,要传递一个元组和另一个值,您可以创建另一个包含两个成员的元组,即大元组和另一个值。正如你所做的:
args=(dcf_data_tuple, excelbtn_text)
但是您传递的参数必须与方法的函数定义相匹配。除非方法采用2个参数,否则传递2个值的有效元组作为方法的参数是无效的
为了解决您的困惑,首先,这并不意味着您认为它的作用:
args=(dcf_data_tuple)
括号不创建元组;逗号创建一个元组。换句话说,(2)
不是包含数字2
的单元素元组,它只是数字2
。而(dct\u data\u tuple)
不是一个包含元组dct\u data\u tuple
的单元素元组,它只是dct\u data\u 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,)
…那么你必须这样称呼它:
def excelOut(self, data0, data1, … hundreds more, …, text):
args=dcf_data_tuple + (excelbtn_text,)
注意结尾的逗号。这意味着
(excelbtn_text,)
是一个单元素元组。然后我们将巨元组添加到1元素元组中,并返回一个巨加1元素元组,它现在与方法的参数匹配。您的解释有点混乱,更多信息将有用(excelOut()
code?code working?…)。我还认为您错过了args
和之间的=
(dfc\u数据…
该元组包含大约241个信息列表,这些信息进入excel电子表格。仅使用args=(dcf\u数据元组)
有效,但是将excelbtn_text
变量添加到args似乎打破了元组的解包。您的解释有点混乱,更多信息会有用(excelOut()
code?code有效?…)。我还认为您错过了args
和(dfc_数据…
元组包含大约241个信息列表,这些信息进入excel电子表格。仅使用args=(dcf_数据元组)
有效,但是将excelbtn_文本
变量添加到args似乎会破坏元组的解包。