【问题标题】:Python - equivalence of calling function with key-value argumentsPython - 使用键值参数调用函数的等效性
【发布时间】:2018-02-27 01:36:25
【问题描述】:

让我们考虑一下 foo(arg1=123, arg2=None) 和 foo(arg1=123).
请告诉我,如果这两种方式是等价的?

【问题讨论】:

  • 提示:为什么你认为它们是等价的?
  • 你想要overloaded函数吗?
  • @heemayl 因为在foo(arg1=123) 的情况下,我们也有arg2=None。是吗?
  • 我已经添加了答案。
  • @newbie 仅当def foo(arg1, arg2=None)。没有隐含的默认值;如果foo 定义为def foo(arg1, arg2),则foo(arg1=123) 是一个错误,因为您没有为所需的参数arg2 提供值。

标签: python


【解决方案1】:

不,两个给定的函数签名(因此函数)不等价。

在foo(arg1=123, arg2=None) 中,您有两个参数——arg1 和arg2,它们可以在函数内部用作本地名称。请注意,就赋值语句而言,将值 None 分配给某个名称不会使它有任何特殊/不同。实际上,为非强制变量或可能是空的可变对象的变量提供占位符值是一种常用方法。

另一方面,foo(arg1=123) 只有一个参数arg1,可在函数的本地范围内使用。


编辑:

如果您将函数定义为foo(arg1, arg2),则两个参数都是强制(位置)参数。

所以,foo(arg1=21) 将抛出一个TypeError,因为您没有提供arg2。而foo(arg1=21, arg2=None) 可以正常工作,因为您已经为这两个参数提供了值。


编辑2:

如果您有一个定义为foo(arg1=None, arg2=None) 的函数(或类似的东西,即具有默认值),则两个参数都是可选(关键字)参数。在这种情况下,这两个定义都是一样的。

【讨论】:

  • 我的意思有些不同。我们有函数:foo(arg1, arg2)。现在,问题是:是否有等效的两个调用:foo(arg1=21) 和foo(arg1=21, arg2=None)。
  • 感谢您的参与。当这两个调用等效时,你能再举一个例子吗?
  • @newbie 这两个调用永远不会相等。现在,我不确定你在说什么。
  • 您使用的术语:mandatory (positional) 。如果这些参数不是强制性的,情况会怎样?
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2011-10-12
相关资源
最近更新 更多