operator
提供attrgetter
来创建一个从对象中检索字段的函数。
为什么不包含在operator
(或标准库中的其他位置)中?
def attrsetter(name):
def setter( obj, val):
setattr(obj, name, val)
return setter
我能想到的唯一原因是存在这种直截了当的方法会破坏的边缘情况。在这种情况下,这些边缘情况是什么,以便我可以尝试捕获/避免它们?
答案 0 :(得分:5)
attrgetter
旨在用于需要函数作为lambda
的替代品的地方。例如:
# equivalent
heads = map(attrgetter('head'), objs)
heads = map(lambda o: o.head, objs)
换句话说,attrgetter
的要点是创建一个无副作用的函数,它返回一个有用的值,并且可以在需要函数的表达式中使用。另一方面,attrsetter
只能通过副作用运行,并且需要通过Python约定返回None
。由于attrsetter
对于map
和类似的参数完全没有用,所以没有提供。如果您需要attrsetter
,只需编写一个正常的for
循环。
另请注意,上述两个习语都可以用列表理解来表达:
heads = [o.head for o in objs]
很少需要 attrgetter
,并且一旦宣布lambda
将不会从Python 3中删除,就会失去很多吸引力。