Python functools.partial能否用于绑定任意位置参数?
假设您希望以任意顺序定义位置参数的分部设置,即您希望将分部应用于str.split,以修复第2个和第3个参数。预期结果与以下相同: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和包装纸是唯一的选择吗 如果您想内联定
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']