operator
提供attrgetter
来创建一个从对象检索字段的函数。
为什么这不包含在operator
中(或标准库中的其他地方)?
def attrsetter(name):
def setter( obj, val):
setattr(obj, name, val)
return setter
我能想到的唯一原因是,在某些极端情况下,这种简单的方法将被打破。在哪种情况下,这些极端情况是什么,以便我可以 try catch /避免它们?
最佳答案
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
几乎不需要,一旦decided毕竟不会从Python 3中删除lambda
,它就失去了很多吸引力。