【问题标题】:Method definition with nested parameters? [closed]带有嵌套参数的方法定义? [关闭]
【发布时间】:2015-03-07 05:42:09
【问题描述】:

为什么这个方法定义在两个参数周围使用额外的括号?

def _myFunc(self, (arg_two, arg_three)):
    Queue._put(self, (arg_two, arg_three))

这是什么意思?这在 Python 的哪些版本中起作用?

【问题讨论】:

  • 这是一个独立的功能吗?或者它是类定义的一部分?
  • 此外,调用私有方法(由前导下划线表示)通常是不好的做法 - 您不需要这样做。
  • 你可以尝试运行它...
  • 前导下划线_ 字符表示它是一个私有函数。它可能是某个类的方法,因为它的第一个参数名为self。 “私有”表示不是类的公共 API 的一部分,只能由该类的其他方法调用(可能还有它可能具有的任何子类)。这也适用于模块中的函数(通常不调用它们的第一个参数self)。这都是约定俗成的,所以它可以在任何版本的 Python 中“工作”。

标签: python


【解决方案1】:

我假设您是在询问方法签名。

def _myFunc(self, (arg_two, arg_three)):

这意味着它需要两个参数:self,而一个元组由两个元素组成,arg_twoarg_three

>>> def f((a, b)):
...   print a, b
...
>>> f((1, 2))
1 2

在此处阅读更多信息:http://legacy.python.org/dev/peps/pep-3113/

【讨论】:

  • 就是这样。谢谢你。 :)
【解决方案2】:

Python 2 函数定义允许您嵌套 参数解包 参数;这是类似于赋值解包的语法。

例如这样做的能力:

foo = (2, 3)
a, (b, c) = 1, foo

扩展到函数签名。见function definition documentationparameter 语法规则允许任意嵌套子列表:

sublist        ::=  parameter ("," parameter)* [","]
parameter      ::=  identifier | "(" sublist ")"

任何子列表参数都需要 一个 外部参数,它是一个序列,可以解包到子列表中的元素数量。因此:

def foo(bar, (baz, spam)): 

需要两个参数,第二个参数是两个值的序列。然后将第一个参数分配给bar 参数,并将第二个参数中的两个值分配给bazspam 参数。

语法在 Python 3 中被删除;它被认为太晦涩难懂,它会产生无用的错误消息,并且参数是不可自省的。见PEP 3112 - Removal of Tuple Parameter Unpacking

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2021-11-04
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多