Python itertools.islice与functools.partial一起使用时引发VALUETERROR

Python itertools.islice与functools.partial一起使用时引发VALUETERROR,python,valueerror,Python,Valueerror,考虑以下python会话(3.6.1): partial似乎以一种非常意外的方式干扰了islice行为 这种行为背后的理由是什么?这是因为islice不处理关键字参数吗?问题在于: partial(islice, 0, 1) 翻译为: islice(0, 1, l) 它失败是因为islice要求其参数按特定顺序排列。但是,以这种方式使用partial会导致参数以错误的顺序传递。如果您将一个伪函数传递给partial,您自己就可以看到这一点: >>> from functoo

考虑以下python会话(3.6.1):

partial
似乎以一种非常意外的方式干扰了
islice
行为


这种行为背后的理由是什么?这是因为islice不处理关键字参数吗?

问题在于:

partial(islice, 0, 1)
翻译为:

islice(0, 1, l)
它失败是因为
islice
要求其参数按特定顺序排列。但是,以这种方式使用
partial
会导致参数以错误的顺序传递。如果您将一个伪函数传递给
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.
>>> 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]

位置参数在其他位置参数之后传递。因此,
partial(islice,0,1)(l)
islice(0,1,l)
是一样的,它不起作用

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


您唯一的选择是使用
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]