Python functools.partial能否用于绑定任意位置参数?

Python functools.partial能否用于绑定任意位置参数?,python,Python,假设您希望以任意顺序定义位置参数的分部设置,即您希望将分部应用于str.split,以修复第2个和第3个参数。预期结果与以下相同: lambda s: str.rsplit(s, SEP, 1) # SEP given. (我使用str.rsplit(s..而不是s.rsplit(…)来更清楚地说明这一点) 使用functools.partial的某些近似值为: 但是str.rsplit不使用关键字参数,只使用位置参数 如何在局部修复这些参数? lamda和包装纸是唯一的选择吗 如果您想内联定

假设您希望以任意顺序定义位置参数的分部设置,即您希望将分部应用于str.split,以修复第2个和第3个参数。预期结果与以下相同:

lambda s: str.rsplit(s, SEP, 1) # SEP given.
(我使用
str.rsplit(s..
而不是
s.rsplit(…
)来更清楚地说明这一点)

使用functools.partial的某些近似值为:

但是str.rsplit不使用关键字参数,只使用位置参数

如何在局部修复这些参数? lamda和包装纸是唯一的选择吗


如果您想内联定义函数,比如为等待函数的参数定义函数,那么包装器就很难看。Lambda是这里的事实,partial是另一个选项,但在这种情况下似乎缺少它。

对于
str.rsplit
,您确实想使用它:


使用
partial
无法做到这一点。这是因为
split
使用C API中的
PyArg\u ParseTuple
函数,该函数不提供关键字参数。从python的角度来看,该方法的定义如下:

def split(self, *args):
    if len(args) > 2:
        raise TypeError(...)
    sep = args[0] if args else None
    maxsplit = args[1] if len(args) > 1 else -1
    ...
Partial只能按顺序分配位置参数。中提到了这一点,其中指出
Partial
大致等同于:

注意
returnfunc(*(args+fargs),**newkeywords)
,它清楚地表明传递给
partial
的参数在其他函数参数前面

结论是
lambda
partial
更强大

另一方面,在python3.3中,您可以指定
maxsplit
作为关键字参数:

>>> 'some string with spaces'.split(maxsplit=2)
['some', 'string', 'with spaces']

许多其他有同样问题的方法/函数也是如此。

Tanks!
return func(*(args+fargs),**newkeywords)
是关键。应该扩展您的要点注释re:lambdas,以给出此案例的示例。
def split(self, *args):
    if len(args) > 2:
        raise TypeError(...)
    sep = args[0] if args else None
    maxsplit = args[1] if len(args) > 1 else -1
    ...
def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc
>>> 'some string with spaces'.split(maxsplit=2)
['some', 'string', 'with spaces']