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似乎会破坏元组的解包。