operattor - attrgetter and methodcaller 使用

时间:2022-12-15 11:55:45

attrgetter

attrgetter 与 itemgetter 作用类似, 它创建的函数根据名称提取对象的属性。 如果把多个属性名传给 attrgetter, 它也会返回提取的值 构成的元组。 此外, 如果参数名中包含 .(点号) , attrgetter 会深入嵌套对象, 获取指定的属性。

from collections import nametuple

# 命名元组
LatLong = namedtuple('LatLong', 'lat long')
Metropolis = namedtuple('Metropolis', 'name cc pop coord')
metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long)) for name, cc, pop, (lat, long) in metro_data]

from operator import attrgetter

name_lat = attrgetter('name', 'coord.lat')

for item in sorted(metro_areas, key=attrgetter('coord.lat')):
    print(name_lat(item))
  

可以应用到实际项目中。dict比较占用内存。nametuple是个不错的选择。搭配attrgetter有很多可能

methodcaller

它的作用与 attrgetter 和 itemgetter 类似, 它会自行创建函数

from operator import methodcaller

a = 'hello world'
upcase = methodcaller('upper')
upcase(a)

有点类似getattr的感觉,但是却有点不一样