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,它就失去了很多吸引力。

10-07 21:39