问题描述
在我的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个参数。