提供了哪些functools.partial
您无法通过 lambdas 获得的功能?
在额外的功能方面并不多(但是,见后文)——而且,可读性是旁观者的眼中。
大多数熟悉函数式编程语言的人(尤其是 Lisp/Scheme 家族的人)似乎都喜欢lambda
——我说“大多数”,绝对不是全部,因为 Guido 和我肯定属于那些“熟悉”的人(等等) 却被认为是lambda
Python 中令人眼花缭乱的异常......
他后悔曾经将它接受到 Python 中,同时计划将其从 Python 3 中删除,作为“Python 的故障”之一。
我完全支持他。(我喜欢lambda
Scheme ......虽然它在 Python中的局限性,以及它只是没有的奇怪方式'用其余的语言,让我的皮肤爬行)。
然而,对于成群的lambda
爱好者来说并非如此——他们上演了 Python 历史上最接近叛乱的事情之一,直到 Guido 退缩并决定
离开lambda
。等)没有发生(以避免明确复制更多的功能),尽管当然仍然存在(这不是完全重复,也不是令人眼花缭乱的)。
functools
lambda
partial
请记住,lambda
的 body 仅限于一个表达式,所以它有限制。例如...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
的返回函数装饰有对内省有用的属性——它包装的函数,以及它在其中修复的位置和命名参数。此外,命名参数可以立即被覆盖(在某种意义上,“修复”是默认值的设置):
>>> f('23', base=10)
23
因此,如您所见,它绝对不像lambda s: int(s, base=2)
!-)
是的,你可以扭曲你的 lambda 来给你一些这个——例如,对于关键字覆盖,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
但我非常希望即使是最热心的lambda
恋人也不会认为这种恐怖比partial
电话更具可读性!-)。“属性设置”部分更加困难,因为 Python 的“主体是单个表达式”的限制lambda
(加上赋值永远不能成为 Python 表达式的一部分的事实)......你最终会“在表达式中伪造赋值”通过将列表理解远远超出其设计限制......:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
现在将命名参数的可覆盖性以及三个属性的设置组合到一个表达式中,然后告诉我它的可读性如何......!