平凡函子
Trivial functors
我经常写这样的代码:
sorted(some_dict.items(), key=lambda x: x[1])
sorted(list_of_dicts, key=lambda x: x['age'])
map(lambda x: x.name, rows)
我想写的地方:
sorted(some_dict.items(), key=idx_f(1))
sorted(list_of_dicts, key=idx_f('name'))
map(attr_f('name'), rows)
使用:
def attr_f(field):
return lambda x: getattr(x, field)
def idx_f(field):
return lambda x: x[field]
在python中是否有像idx_f和attr_f这样的仿函数创建器,它们在使用时是否比lambda更清晰?
operator
模块有 operator.attrgetter()
and operator.itemgetter()
可以做到这一点:
from operator import attrgetter, itemgetter
sorted(some_dict.items(), key=itemgetter(1))
sorted(list_of_dicts, key=itemgetter('name'))
map(attrgetter('name'), rows)
这些函数还接受 多个 参数,此时它们将 return 一个包含每个参数值的元组:
# sorting on value first, then on key
sorted(some_dict.items(), key=itemgetter(1, 0))
# sort dictionaries by last name, then first name
sorted(list_of_dicts, key=itemgetter('last_name', 'first_name'))
attrgetter()
函数也接受点名,这里可以达到属性的属性:
# extract contact names
map(attrgetter('contact.name'), companies)
我经常写这样的代码:
sorted(some_dict.items(), key=lambda x: x[1])
sorted(list_of_dicts, key=lambda x: x['age'])
map(lambda x: x.name, rows)
我想写的地方:
sorted(some_dict.items(), key=idx_f(1))
sorted(list_of_dicts, key=idx_f('name'))
map(attr_f('name'), rows)
使用:
def attr_f(field):
return lambda x: getattr(x, field)
def idx_f(field):
return lambda x: x[field]
在python中是否有像idx_f和attr_f这样的仿函数创建器,它们在使用时是否比lambda更清晰?
operator
模块有 operator.attrgetter()
and operator.itemgetter()
可以做到这一点:
from operator import attrgetter, itemgetter
sorted(some_dict.items(), key=itemgetter(1))
sorted(list_of_dicts, key=itemgetter('name'))
map(attrgetter('name'), rows)
这些函数还接受 多个 参数,此时它们将 return 一个包含每个参数值的元组:
# sorting on value first, then on key
sorted(some_dict.items(), key=itemgetter(1, 0))
# sort dictionaries by last name, then first name
sorted(list_of_dicts, key=itemgetter('last_name', 'first_name'))
attrgetter()
函数也接受点名,这里可以达到属性的属性:
# extract contact names
map(attrgetter('contact.name'), companies)