跳转至

Python3 operator

概念与用途

operator 将 Python 运算符和取值操作封装为函数,适合排序 key、归约和函数式 API。它常比简单 lambda 更简洁,并明确表达“取字段”或“执行运算”。

核心 API

itemgetter() 按索引或键取值,attrgetter() 取属性,methodcaller() 调用方法;add、mul、contains 等对应常见运算符。

from operator import itemgetter, methodcaller

records = [("Alice", 88), ("Bob", 95), ("Carol", 80)]
print(sorted(records, key=itemgetter(1), reverse=True))
clean = methodcaller("strip")
print(clean("  Python  "))

常用函数

函数 等价操作 典型用途
itemgetter(k) obj[k] 字典/元组排序
attrgetter(name) obj.name 对象排序
methodcaller(name) obj.name() 批量调用方法
add/mul a + b / a * b 归约操作

示例:对象属性排序

from dataclasses import dataclass
from operator import attrgetter

@dataclass
class Job:
    priority: int
    name: str

jobs = [Job(2, "docs"), Job(1, "build"), Job(2, "test")]
print(sorted(jobs, key=attrgetter("priority", "name")))

operator 是标准库,无需安装。getter 使用的字段名仍需来自可信程序配置;让用户任意选择深层属性可能暴露本不应公开的数据。

常见错误与工程注意

  • itemgetter(1) 对缺少索引的数据会抛异常,输入结构需先验证。
  • 多字段 getter 返回元组,排序方向若各字段不同仍需显式 key。
  • 不要为了函数式风格牺牲清晰度,复杂规则使用具名函数。