首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >itertools.islice在与functools.partial一起使用时引发ValueError

itertools.islice在与functools.partial一起使用时引发ValueError
EN

Stack Overflow用户
提问于 2017-08-19 22:38:20
回答 2查看 1.1K关注 0票数 4

考虑到以下python会话(3.6.1):

代码语言:javascript
复制
>>> from itertools import islice
>>> l = [i for i in range(10)]
>>> islice(l, 0, 1)
<itertools.islice object at 0x7f87c9293638>
>>> (lambda it: islice(it, 0, 1))(l)
<itertools.islice object at 0x7fe35ab40408>

这里没有什么是意外的。现在,用functools.partial

代码语言:javascript
复制
>>> from functools import partial
>>> partial(islice, 0, 1)(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize.

partial似乎以一种非常出乎意料的方式介入了islice行为。

这种行为背后的理由是什么?like str.split few versions ago,这是因为孤岛不处理关键字参数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-19 22:46:45

位置参数在其他位置参数之后传递。因此,partial(islice, 0, 1)(l)islice(0, 1, l)是一样的,但这是行不通的。

不能使用分部以不同的顺序传递参数;只有关键字参数才允许这样做。因为islice没有关键字参数,所以不能在这里使用partial()

您唯一的选择是使用lambda

票数 4
EN

Stack Overflow用户

发布于 2017-08-19 22:44:30

问题是:

代码语言:javascript
复制
partial(islice, 0, 1)

翻译为:

代码语言:javascript
复制
islice(0, 1, l)

它失败了,因为islice按照特定的顺序期望它的参数。然而,使用partial会导致参数以错误的顺序传递。如果将一个虚拟函数传递给partial,您可以自己看到这一点。

代码语言:javascript
复制
>>> def func(*args):
    print('args:', args)


>>> partial(func, 0, 1)(l)
args: (0, 1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

而且,由于不能在islice中使用关键字参数来更改传递参数的顺序,所以不能在这里使用partial。正如@Martijn Pieters所说,只需使用普通函数或lambda即可。

代码语言:javascript
复制
>>> from itertools import islice
>>> from functools import partial
>>> 
>>> f = lambda l: islice(l, 0, 1)
>>> l = [i for i in range(10)]
>>> list(f(l))
[0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45776872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档