Python:arg =myDict,和arg =myDict

问题描述

在我的python代码中,我有一个类。我想在线程中运行类的方法。该方法以字典为参数。

def func1(self,input_dictionary):
    ...

为了使该方法在线程中运行,我发现我需要将字典以(mydict,)的形式传递给函数

threading.Thread(target=self.func1,arg=(mydict,)) 

我想知道arg=(myDict,)arg=(myDict)间的区别。 ,之后的mydict元组有什么作用?

运行以下命令将导致python抱怨self.func1接受2个位置参数,而我输入了错误的输入数。

threading.Thread(target=self.func1,arg=(mydict)) # or the next one
threading.Thread(target=self.func1,arg=mydict)

有人能对此有所启发吗?

解决方法

一个常见的误解是括号在Python中创建了元组。

通过arg=(myDict)等同于通过arg=myDict,类似于(1) + (1)等同于数学中的1 + 1

实际上,逗号使Python解析器确定您实际上是在构建元组。这意味着,要使一个元组具有单个元素,您需要添加一个有点尴尬的结尾逗号。您可以在Python REPL中自己检查此行为:

>>> (1)
1
>>> type((1))
<class 'int'>
>>> (1,)
(1,)
>>> type((1,))
<class 'tuple'>

因此,在您的情况下,您需要传递arg=(myDict,)以确保您的参数作为元组传递。

,

答案是末尾的','使括号定义一个元组。而且没有逗号,只是多余的括号。

关于9个参数(而不是2个参数),python在做什么,如下所示:它期望将一个参数元组解压缩,因此它将尝试解压缩它传递的对象。

事实证明my_dict有9个值,因此它们被解压缩为参数-在函数中提供9个参数。