代码之家  ›  专栏  ›  技术社区  ›  Torin M.

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

  •  0
  • Torin M.  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  4
  •   abarnert    8 年前

    首先,要传递一个元组和另一个值,您只需使用两个成员(大元组和另一个值)创建另一个元组。和你一样:

    args=(dcf_data_tuple, excelbtn_text)
    

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


    要解决你的困惑,首先,这并不意味着你认为它会:

    args=(dcf_data_tuple)
    

    括号不创建元组;逗号创建元组。换句话说, (2) 不是包含元素的1元组元组 2 ,只是号码 . 和 (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元组元组,并返回一个GIANT-PLUES-1元素元组,它现在匹配方法的参数。

        2
  •  0
  •   Gsk    8 年前

    如果我理解您的问题,您可以在元组前添加星号来传递展开的参数:

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