functools.partiallambdas无法提供哪些功能?
在额外功能方面并没有太多(但是,请参阅稍后)–可读性在旁观者的眼中。
大多数熟悉函数式编程语言的人(尤其是
Lisp / Scheme系列的人)看起来都lambda很好–我说“大多数”,绝对不是全部,因为
Guido和我肯定是“熟悉”的人(等) 却被认为是lambdaPython中的一个令人眼花eyes乱的异常……
他为曾经接受过Python而打算将其从Python 3中删除(作为“ Python的小故障”之一)感到re悔。
我对此表示完全支持。(我喜欢
lambda Scheme ...但它在Python中有其局限性,而它只是奇怪的方式而没有’ 使用其他语言,让我的皮肤变得爬行)。
但是,对于成群的
lambda恋人而言并非如此-他们在Python历史上曾发生过与叛逆最接近的事情之一,直到
Guido回溯并决定离开
lambda。
一些可能的添加
functools(以使函数返回常量,标识,等)没有发生(避免显式地复制的更多lambda功能),尽管
partial当然仍然存在(这不是完全复制,也不是令人讨厌的)。
请记住,
lambda的身体仅限于表达,因此有其局限性。例如…:
>>> 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]
现在结合命名参数覆盖性,再加上三个属性的设置,到一个单一的表达,并告诉我是多么可读那将是…!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)