Python - equivalence of calling function with key-value arguments
我们考虑一下foo(arg1=123, arg2=None)和foo(arg1=123)。请告诉我,这两种方法是否相同?
- 提示:你为什么认为它们是等效的?
- 是否要重载函数?
- @Heemayl因为在foo(arg1=123)的情况下,我们也有arg2=None的情况。是吗?
- 我添加了一个答案。
- @只有当def foo(arg1, arg2=None)时才是新手。没有隐含的默认值;如果foo定义为def foo(arg1, arg2),那么foo(arg1=123)是一个错误,因为您没有为所需参数arg2提供值。
- 如果这些是定义,那么它们显然是不等价的。如果这些是调用,那么它们是否等价取决于如何定义foo。
不,两个给定的函数签名(因此函数)是不等价的。
在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)。
- @新手检查我的编辑。
- 谢谢你的参与。当这两个调用相等时,您能再举一个例子吗?
- @新手这两个电话永远不会对等。现在,我不知道你在干什么。
- 您使用的术语:mandatory (positional) 。当这些论点不是强制性的时候,情况如何?
- @新手检查我的编辑。