Python 没有关键字参数的库函数

Python library functions taking no keyword arguments

当我尝试对 python 中的问题应用更实用的方法时,就出现了这个问题。 我试图做的只是对数字列表进行平方,没什么大不了的。

from operator import pow
from functools import partial 

squared = list(map(partial(pow, b=2), range(10))

事实证明,这没有用。 TypeError: pow() takes no keyword arguments

困惑我检查了 pow(b=2, a=3) 是否有。没有。

我已经检查了 operator source code,没有任何可疑之处。

迷茫,开始怀疑自己的python知识,自己做了一个pow函数

def pow(a, b):
  return a ** b

然后我尝试用我的函数做同样的事情,令人惊讶的是,一切正常。

我不会猜测问题的原因是什么,我想问的只是 为什么 这是一个问题,是否存在解决方法。

如果您使用交互式 shell 中的 help() 函数检查内置 pow()operator.pow() 的签名,您会发现它们需要仅位置 参数(注意尾部斜杠):

pow(x, y, z=None, /)
pow(a, b, /)

原因是这两个函数都是用 C 语言实现的,并且没有参数名称。您必须按位置提供参数。作为解决方法,您可以创建一个纯 Python pow() 函数:

def pow(a, b):
    return a ** b

另请参阅常见问题解答中的 What does the slash(/) in the parameter list of a function mean?

在 Python 的当前版本中,许多 CPython "builtin" 和标准库函数只接受位置参数。通过调用帮助方法可以很容易地观察到结果语义。

>>>>help(pow)

Help on built-in function pow in module builtins:

pow(x, y, z=None, /) Equivalent to x**y (with two arguments) or x**y % z (with three arguments)

Some types, such as ints, are able to use a more efficient algorithm when
invoked using the three argument form.

您问题中提到的运算符源代码可能与您尝试使用的 python 版本不匹配。

pow 作为库函数接受仅位置参数。因此,您可以按照以下方式执行上述操作:

squared = list(map(partial(pow,2), range(10)))

关于您的其他问题,默认情况下用户定义函数的参数是 positional-or-keyword parameters,因此可以作为常规参数或 kw 参数使用。当然,定义一个新函数 pow 可能会在以后造成混淆,但要小心。

错误来自 b=2 语句。

squared = list(map(partial(pow, b=2), range(10))

部分函数将关键字参数 'b' 传递给 pow 函数,这会导致错误,因为 pow() 函数仅采用位置参数。有关详细信息,请参阅 help(pow)

但是,我发现此调用的另一个问题是部分函数以意外方式运行:

map(partial(pow, 2), range(10))

生成此序列的结果:

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

说明偏函数实际上是在计算2^range(10)

如果您要做的是对列表中的每个值求平方,我建议使用 lambda 函数简化代码:

b=2
test = map(lambda x: x**b, range(10))
print(list(test))

这导致:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

无需进口。