考虑到以下python会话(3.6.1):
>>> 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
>>> 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,这是因为孤岛不处理关键字参数吗?
发布于 2017-08-19 22:46:45
位置参数在其他位置参数之后传递。因此,partial(islice, 0, 1)(l)和islice(0, 1, l)是一样的,但这是行不通的。
不能使用分部以不同的顺序传递参数;只有关键字参数才允许这样做。因为islice没有关键字参数,所以不能在这里使用partial()。
您唯一的选择是使用lambda。
发布于 2017-08-19 22:44:30
问题是:
partial(islice, 0, 1)翻译为:
islice(0, 1, l)它失败了,因为islice按照特定的顺序期望它的参数。然而,使用partial会导致参数以错误的顺序传递。如果将一个虚拟函数传递给partial,您可以自己看到这一点。
>>> 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即可。
>>> 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]https://stackoverflow.com/questions/45776872
复制相似问题