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]
无需进口。
当我尝试对 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) orx**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]
无需进口。