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

alu*_*iak 5 python valueerror

考虑以下 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>
Run Code Online (Sandbox Code Playgroud)

这里没有什么是意外的。现在,与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.
Run Code Online (Sandbox Code Playgroud)

partialislice似乎以一种非常意想不到的方式干扰行为。

这种行为背后的理由是什么?这是因为 islice 不处理关键字参数,就像几个版本前的 str.split 吗

Mar*_*ers 5

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

您不能使用部分以不同的顺序传递参数;只有关键字参数才允许这样做。由于islice不接受关键字参数,因此您不能使用partial()here

您唯一的选择是使用lambda.