为什么';python是否有attrsetter(需要什么才能创建一个attrsetter)?

为什么';python是否有attrsetter(需要什么才能创建一个attrsetter)?,python,Python,operator提供了attrgetter函数,用于从对象检索字段 为什么这不包括在操作符中(或标准库中的其他地方) 我能想到的唯一原因是,在一些边缘情况下,这种直接的方法将被打破。在这种情况下,这些边缘情况是什么,我可以尝试捕捉/避免它们?attrgetter设计用于需要函数替换lambda的地方。例如: # equivalent heads = map(attrgetter('head'), objs) heads = map(lambda o: o.head, objs) 换句话说,at

operator
提供了
attrgetter
函数,用于从对象检索字段

为什么这不包括在
操作符中(或标准库中的其他地方)


我能想到的唯一原因是,在一些边缘情况下,这种直接的方法将被打破。在这种情况下,这些边缘情况是什么,我可以尝试捕捉/避免它们?

attrgetter
设计用于需要函数替换
lambda
的地方。例如:

# equivalent
heads = map(attrgetter('head'), objs)
heads = map(lambda o: o.head, objs)
换句话说,
attrgetter
的要点是创建一个无副作用的函数,该函数返回一个有用的值,可以在需要函数的表达式中使用。另一方面,
attrsetter
只会产生副作用,并且根据Python约定需要返回
None
。由于
attrsetter
作为
map
和类似文件的参数将毫无用处,因此不提供它。如果需要
attrsetter
,只需为
循环编写一个普通的

还请注意,以上两种习惯用法都可以通过列表理解更好地表达:

heads = [o.head for o in objs]

attrgetter
很少被需要,而且一旦
lambda
最终不会从Python 3中删除,它就失去了很多吸引力。

itemsetter
也丢失了。我敢打赌,它没有getter对应项那么有用,所以他们没有添加它。也许他们只是看不到很多用例。通常,这些运算符返回一个值,以便在功能上使用它们,例如与
map
filter
等一起使用。设置某个值通常返回
None
。此外,由于
attributeter
提供了允许更多属性和虚线名称的奇特功能,您可能想创建一个对称的setter,它能够设置多个带有虚线名称的属性。@Bakuriu它实际上被调用是为了与
\uuuuuu setitem\uuuuu
保持一致。我认为,考虑到
操作符
模块提供的
setitem
delitem
,副作用参数是没有意义的。我也同意,大多数时候,通过理解可以更好地表达attrgetter,但是使用前者有一些有效的用例。使
attrgetter
lambda
更具吸引力的一点是,CPython提供的C实现在热循环中要快得多,并且允许使用
attrgetter(*attrs)
@SimonCharette一次检索多个属性。我同意副作用不是必需的。根据它出现的时间,我认为,
attrgetter
是将Python从
lambda
中去除的短暂尝试(而且是我误导的)的结果
lambda x:x.foo
经常被引用为
lambda
有用性的一个例子,因此引入了
attrgetter
来替代它。由于
setattr
很少在lambdas中使用,因此不需要
attrsetter
。这不是一个很好的理由,不在未来有一个,只是一个解释为什么它没有添加最初。如果您需要它,我认为建议在bugs.python.org上添加它是有意义的。
heads = [o.head for o in objs]