python 中 functools.partial 的参数用法疑惑

2016-08-11 20:18:59 +08:00
 Dimen61

我已经知道的

我们知道可以这样来用partial

import functools
int2 = functools.partial(int, base=2)
print(int2('10001'))
# Output: '17'

int 函数的解释如下:

class int(object)
 |  int(x=0) -> integer
 |  int(x, base=10) -> integer
 |
 |  Convert a number or string to an integer, or return 0 if no arguments
 |  are given.  If x is a number, return x.__int__().  For floating point
 |  numbers, this truncates towards zero.

则指定 func 最靠左的那个参数为 arg1

def fun(x, y, z):
    print('x: {0}; y: {1}; z: {2}'.format(x, y, z))

f1 = functools.partial(fun, 1)
f1(2, 3)
# Output: 'x: 1; y: 2; z: 3'

我们也可以通过在 parital 中通过指定默认参数来绑定 func 中的参数值

f2 = functools.partial(fun, z=3)
f2(2, 1)
# Output: 'x: 2; y: 1; z: 3'

我的问题

sum_100 = functools.partial(sum, start=100)
print(sum_100([1, 2, 3]))
#TypeError: sum() takes no keyword arguments

sum 函数的说明:

sum(iterable, start=0, /)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers

When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.

既然这样对 sum 函数不行,为什么能成功作用于 int 了

import functools
int2 = functools.partial(int, base=2)
print(int2('10001'))
# Output: '17'

int 函数的解释如下:

class int(object)
 |  int(x=0) -> integer
 |  int(x, base=10) -> integer
 |
 |  Convert a number or string to an integer, or return 0 if no arguments
 |  are given.  If x is a number, return x.__int__().  For floating point
 |  numbers, this truncates towards zero.
2817 次点击
所在节点    Python
6 条回复
knightdf
2016-08-11 20:28:27 +08:00
sum(sequence[, start]) -> value
Dimen61
2016-08-11 20:34:49 +08:00
@knightdf 啥意思,可否详细解释下
petelin
2016-08-11 20:43:07 +08:00
sum 函数不接受 start 这个关键字参数,你找的函数解释跟你用的版本不对,或者别的什么的
zhuangzhuang1988
2016-08-11 20:51:31 +08:00
python 源码参考这里
https://github.com/python/cpython/blob/2.7/Python/bltinmodule.c#L2307

sum 没有通过关键字获取 start
```python
import functools
def _sum(seq, start=0):
return sum(seq, start)
f = functools.partial(_sum, start=100)
print f([1,2,3])
```
这样解决。。
eric6356
2016-08-11 21:06:58 +08:00
我猜你是用了 IPython 之类的看的说明。 IPython 会调用 inspect 去取对象的 signature 。而对于这种 built-in 函数,真正的参数并不像你看到的 signature 那样。还是应当以文档或者源码为准。
Dimen61
2016-08-11 21:49:08 +08:00
感谢大家,我是在 python3 终端交互下,用 help(sum)查看的函数解释

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298728

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX