【问题标题】:Python: Difference Between arg=(myDict,) and arg=(myDict)Python:arg=(myDict,) 和 arg=(myDict) 之间的区别
【发布时间】:2020-12-17 01:51:36
【问题描述】:

在我的 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)

有人能解释一下吗?

【问题讨论】:

  • arg= 的任何版本都是错误的 - 参数名称是 args。这似乎是一个需要争论的小细节,但你只是被这样一个小细节所吸引。发帖时请多加注意此类内容。此类拼写错误会掩盖问题的实际原因。
  • 完全正确。对不起。我因遇到的问题而分心,忘记了帖子中的其他细节。
  • 删除 [multithreading] 标签,因为这个问题及其答案与线程无关。这只是一个关于 Python 语言的问题。

标签: python arguments tuples


【解决方案1】:

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

【讨论】:

  • 很棒的插图!现在我完全明白了。谢谢。
【解决方案2】:

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

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

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

【讨论】:

猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
相关资源
最近更新 更多