Python: arg=(myDict,) 和 arg=(myDict) 之间的区别

Python: Difference Between arg=(myDict,) and arg=(myDict)

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

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)

有人可以解释一下吗?

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

关于 9 个参数而不是 2 个参数,python 正在做的事情如下:它需要一个参数元组来解包,因此它尝试解包它传递的对象。

原来 my_dict 有 9 个值,所以它们被解包为参数 - 在函数中给出 9 个参数。

括号在 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,) 以确保你的参数作为元组传递。