【问题标题】:How to pass tuple and variable as args如何将元组和变量作为参数传递
【发布时间】:2018-12-01 07:20:42
【问题描述】:

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

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。无论如何我可以解决这个问题吗?

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

【问题讨论】:

  • 您的解释有点混乱,更多信息会很有用(excelOut() 代码?代码工作?...)。我还认为您错过了args(dfc_data... 之间的=
  • 该元组包含大约 241 个信息列表,这些信息将进入 Excel 电子表格。仅使用 args=(dcf_data_tuple) 有效,但是将 excelbtn_text 变量添加到 args 似乎会破坏元组解包。

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


【解决方案1】:

首先,要传递一个元组和另一个值,您可以只创建另一个包含两个成员的元组——大元组和另一个值。就像你正在做的那样:

args=(dcf_data_tuple, excelbtn_text)

但是您传递的参数必须与方法的函数定义相匹配。传递 2 个值的有效元组作为方法的参数不起作用,除非该方法采用 2 个参数。


为了解决您的困惑,首先,这并不意味着您认为它会做什么:

args=(dcf_data_tuple)

括号不创建元组;逗号创建一个元组。换句话说,(2) 不是包含数字2 的一元元组,它只是数字2。而(dct_data_tuple) 不是包含元组dct_data_tuple 的单元素元组,它只是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 元素元组,它现在与方法的参数匹配。

【讨论】:

    【解决方案2】:

    如果我理解你的问题,你可以在你的元组之前添加一个星号来传递解包的参数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多