官方入口:https://docs.python.org/3.7/library/operator.html#module-operator
operator.
itemgetter
(item)
operator.
itemgetter
(*items)
返回callable对象,调用被操作对象的 __getitem__()
方法:
-
After
f = itemgetter(2)
, the callf(r)
returnsr[2]
. -
After
g = itemgetter(2, 5, 3)
, the callg(r)
returns(r[2], r[5], r[3])
之所以用 itemgetter(2, 5, 3) 而不用(r[2], r[5], r[3]),是因为itemgetter的方式要更快一些,可提升效率。
应用(常用于key参数处,代替lambda):
itemgetter(1)('ABCDEFG')
#'B'
itemgetter(1,3,5)('ABCDEFG')
#('B', 'D', 'F')
itemgetter(slice(2,None))('ABCDEFG')
#'CDEFG'
soldier = dict(rank='captain', name='dotterbart')
itemgetter('rank')(soldier)
#'captain'
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
#等价于如下,但itemgeter更快
rows_by_fname = sorted(rows, key=lambda r: r['fname'])
rows_by_lfname = sorted(rows, key=lambda r: (r['lname'],r['fname']))
operator.
attrgetter
(attr)
operator.
attrgetter
(*attrs)
类似itemgetter,取field值,也是可提高效率。
-
After
f = attrgetter('name')
, the callf(b)
returnsb.name
. -
After
f = attrgetter('name', 'date')
, the callf(b)
returns(b.name, b.date)
. -
After
f = attrgetter('name.first', 'name.last')
, the callf(b)
returns(b.name.first, b.name.last)
.
class User:
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return 'User({})'.format(self.user_id)
users = [User(23), User(3), User(99)]
sorted(users, key=attrgetter('user_id'))
#[User(3), User(23), User(99)]
#等价于如下,但更高效
sorted(users, key=lambda u: u.user_id)
operator.
methodcaller
(name[, args...])
取方法。
-
After
f = methodcaller('name')
, the callf(b)
returnsb.name()
. -
After
f = methodcaller('name', 'foo', bar=1)
, the callf(b)
returnsb.name('foo', bar=1)
.
等价于:
def caller(obj):
return getattr(obj, name)(*args, **kwargs)
return caller