我正在将一堆python 2.7代码迁移到python 3,它在python 2.7中有这样的模式:
sorted(some_list, cmp=custom_compare, key=custom_key_getter)
我能想出的最好的迁移方法如下:
sorted(some_list,
key=functools.cmp_to_key(
lambda x,y: custom_compare(custom_key_getter(x),
custom_key_getter(y)))
有更好的方法吗?还是更符合python 3的惯用方式?
答案 0 :(得分:2)
作为权宜之计的解决方案,我认为没关系。
如果您有多个custom_compare
和custom_key_getter
的组合,我会将lambda分解为
def compare_using(custom_compare, custom_key_getter):
def comparator(x, y):
return custom_compare(custom_key_getter(x), custom_key_getter(y))
return comparator
如果您只有几个组合,我可以想象将它们预先计算出来,例如
compare_names_special = compare_using(compare_special, itemgetter('name'))
...
customers_by_name = sorted(customers, compare_names_special)
性能不应受到影响,因为这段代码只是表明了Python 2的排序所做的事情。
从长远来看,我会考虑重写自定义比较函数,以便它们不需要cmp_to_key
处理;在大多数情况下,它应该是微不足道的。