我注意到operator.itemgetter
对象没有定义__eq__
,因此它们的比较默认为检查标识(is
)。
当初始化参数列表比较为相等时,将两个itemgetter
实例定义为相等有什么缺点吗?
这里有一个这样比较的用例假设您定义了一个排序数据结构,其构造函数需要一个键函数来定义排序假设您想检查两个这样的数据结构是否具有相同的键函数(例如,在assert
语句中;或者验证它们是否可以安全地合并;等等)。
如果我们能在两个关键函数itemgetter('id')
时肯定地回答这个问题,那就太好了。但目前,itemgetter('id') == itemgetter('id')
的计算结果是False
。
最佳答案
Niklas的答案很聪明,但是需要一个更强大的条件,因为itemgetter
可以接受多个参数
from collections import defaultdict
from operator import itemgetter
from itertools import count
def cmp_getters(ig1, ig2):
if any(not isinstance(x, itemgetter) for x in (ig1, ig2)):
return False
d1 = defaultdict(count().next)
d2 = defaultdict(count().next)
ig1(d1) # populate d1 as a sideeffect
ig2(d2) # populate d2 as a sideeffect
return d1==d2
一些测试用例
>>> cmp_getters(itemgetter('foo'), itemgetter('bar'))
False
>>> cmp_getters(itemgetter('foo'), itemgetter('bar','foo'))
False
>>> cmp_getters(itemgetter('foo','bar'), itemgetter('bar','foo'))
False
>>> cmp_getters(itemgetter('bar','foo'), itemgetter('bar','foo'))
True