关键字如何继承默认参数

How keywords inherit to default arguments

我们知道偏函数是针对特定参数值的原始函数。部分函数的基本语法是,

partial(func[, *args][, **keywords])

现在,让我们假设一个特定的程序。

from functools import partial

def power(a, b):
    return a ** b
pw = partial(power, b=4)
print('Default keywords for pw :', pw.keywords)
print('Default arguments for pw :', pw.args)
print('Answer of pw is: ',pw(3))

# Output
# -------
# Default keywords for pw: {'b': 4}
# Default arguments for pw: ()
# Answer of pw is:  81

输出正确,上面的部分函数我将关键字设置为 b=4,默认 agrs()。现在,如果我省略关键字 b 并且那个地方我只放了 4。场景更改为答案是 64.

partial(power, 4)

# Output
# -------
# Default keywords for pw: {}
# Default arguments for pw: (4,)
# Answer of pw is:  64

我的问题是为什么当我不想传递 b 时参数和关键字会互换,因为虽然在第一种情况下我没有传递 a 但结果是正确的。

我认为您对此处 partialpositional 以及 keyword 参数的相互作用感到困惑。

简单解释如下:when关键字arg。在调用中使用,列出参数的顺序 NOT 很重要! Python 按名称匹配,而不是 命令。调用者必须提供 - 垃圾邮件,以及接下来显示的示例中的鸡蛋,但它们可以按位置或按名称进行匹配 - 正如您在最后 2 个示例中看到的那样。

def func(spam, eggs, toast=0, ham=1): # first 2 required
    print((spam, eggs, toast, ham))


func(1, 2)                  #  (1, 2, 0, 1)
func(1, ham=2, eggs=0)      #  (1, 0, 0, 2)
#        *****
#
print('------------------')
print('spam-lover, hate eggs: ') 
func(spam=2, eggs=0)        #  (2, 0, 0, 1)

print()
print('love spam and eggs: ')
func(toast=1, eggs=4, spam=2) # (2, 4, 1, 1)

print('love spam/eggs and ham, want it toast too! ')
func(ham=6, eggs=4, spam=2, toast=1) # (2, 4, 1, 6)

func(1, 2, 3, 4)             #  (1, 2, 3, 4)

形式 - name=value 在调用和 def 中的含义不同!!!

  1. 调用中的关键字和
  2. a default 在函数中。 header.

您提供 4 作为 位置 参数,并且在调用 partial 实例时严格从左到右应用这些参数。也就是说,partial(f, 4) 大致相当于 lambda x: pow(4, x)。如果不使用关键字参数,就无法用 partial 定义函数 lambda x: pow(x, 4) 的等价物。