为什么python没有一个attrsetter(以及制作一个它需要什么)?

时间:2014-12-19 15:31:35

标签: python

operator提供attrgetter来创建一个从对象中检索字段的函数。

为什么不包含在operator(或标准库中的其他位置)中?

def attrsetter(name):
    def setter( obj, val):
        setattr(obj, name, val)
    return setter

我能想到的唯一原因是存在这种直截了当的方法会破坏的边缘情况。在这种情况下,这些边缘情况是什么,以便我可以尝试捕获/避免它们?

1 个答案:

答案 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中删除,就会失去很多吸引力。