operator - 标准运算符代替

1. 标准运算符代替

项目信息
源代码Lib/operator.py在新窗口打开
Python 版本全版本
标签函数式编程

标准库 operator 中包含一系列函数,用于在一些场景下代替标准运算符操作。

魔术方法

许多方法都有对应的魔术方法。因此,许多函数也提供了后向兼容的双下划线版本,在下表中带有星号的方法都有其双下划线版本。如果函数名已经有下划线结尾,那么结尾还是双下划线,此下划线只是为了和关键字区分。

不建议双下划线版本以确保表述清晰。

例如下面是一些对应的双下划线版本:

标准方法双下划线版本
operator.lt(a, b)operator.__lt__(a, b)
operator.le(a, b)operator.__le__(a, b)
operator.eq(a, b)operator.__eq__(a, b)
operator.ne(a, b)operator.__ne__(a, b)
operator.ge(a, b)operator.__ge__(a, b)
operator.gt(a, b)operator.__gt__(a, b)

1.1 比较运算符

运算语法函数
小于a < blt(a, b) *
小于等于a <= ble(a, b) *
等于a == beq(a, b) *
不等于a != bne(a, b) *
大于等于a >= bge(a, b) *
大于a > bgt(a, b) *

1.2 逻辑运算符

运算语法函数
逻辑否定not anot_(a) *
真值测试objtruth(obj)
标识a is bis_(a, b)
标识a is not bis_not(a, b)

1.3 算术运算符

运算语法函数
绝对值abs(a) *
转换为整数index(a) *
正数+ apos(a) *
算术取反- aneg(a) *
加法a + badd(a, b) *
减法a - bsub(a, b) *
乘法a * bmul(a, b) *
除法a / btruediv(a, b) *
整除a // bfloordiv(a, b) *
取幂a ** bpow(a, b) *
取模a % bmod(a, b) *
矩阵乘法 3.5+a @ bmatmul(a, b) *
按位与a & band_(a, b) *
按位异或a ^ bxor(a, b) *
按位取反~ ainv(a) *、invert(a) *
按位或a | bor_(a, b) *
右移a >> brshift(a, b) *
左移a << blshift(a, b) *

1.4 序列操作

运算语法函数
ba 中出现的次数countOf(a, b)
ba 中首次出现的索引indexOf(a, b)
对象的估计长度 3.4+length_hint(obj, default=0)
序列拼接seq1 + seq2concat(seq1, seq2) *
包含测试obj in seqcontains(seq, obj) *
索引赋值obj[k] = vsetitem(obj, k, v) *
索引取值obj[k]getitem(obj, k) *
索引删除del obj[k]delitem(obj, k) *
切片赋值seq[i:j] = valuessetitem(seq, slice(i, j), values) *
切片取值seq[i:j]getitem(seq, slice(i, j)) *
切片删除del seq[i:j]delitem(seq, slice(i, j)) *
字符串格式化s % objmod(s, obj) *

1.5 原地运算符

语法函数
a += biadd(a, b) *
a &= biand(a, b) *
a += biconcat(a, b) *(其中 ab 为序列)
a //= bifloordiv(a, b) *
a <<= bilshift(a, b) *
a %= bimod(a, b) *
a *= bimul(a, b) *
a @= b 3.5+imatmul(a, b) *
a |= bior(a, b) *
a **= bipow(a, b) *
a >>= birshift(a, b) *
a -= bisub(a, b) *
a /= bitruediv(a, b) *
a ^= bixor(a, b) *

1.6 可调用对象

运算语法函数
调用对象 3.11+obj(*args, **kwargs)operator.call(obj, /, *args, **kwargs) *

2. 函数式编程工具

operator 模块还定义了一些用于常规属性和条目查找的工具。 这些工具适合用来编写快速字段提取器作为 map()sorted()itertools.groupby() 或其他需要相应函数参数的函数的参数。

2.1 属性获取器

语法
operator.attrgetter(attr)
operator.attrgetter(*attrs)

返回一个可从操作数中获取 attr 的可调用对象。如果请求了一个以上的属性,则返回一个属性元组。属性名称还可包含点号。例如:

  • f = attrgetter('name') 之后,调用 f(b) 将返回 b.name
  • f = attrgetter('name', 'date') 之后,调用 f(b) 将返回 (b.name, b.date)
  • f = attrgetter('name.first', 'name.last') 之后,调用 f(b) 将返回 (b.name.first, b.name.last)
等价实现
def attrgetter(*items):
    if any(not isinstance(item, str) for item in items):
        raise TypeError('attribute name must be a string')
    if len(items) == 1:
        attr = items[0]
        def g(obj):
            return resolve_attr(obj, attr)
    else:
        def g(obj):
            return tuple(resolve_attr(obj, attr) for attr in items)
    return g

def resolve_attr(obj, attr):
    for name in attr.split("."):
        obj = getattr(obj, name)
    return obj

2.2 成员获取器

语法
operator.itemgetter(item)
operator.itemgetter(*items)

返回一个使用操作数的 __getitem__() 方法从操作数中获取 item 的可调用对象。如果指定了多个条目,则返回一个查找值的元组。例如:

  • f = itemgetter(2) 之后,调用 f(r) 将返回 r[2]
  • g = itemgetter(2, 5, 3) 之后,调用 g(r) 将返回 (r[2], r[5], r[3])
等价实现
def itemgetter(*items):
    if len(items) == 1:
        item = items[0]
        def g(obj):
            return obj[item]
    else:
        def g(obj):
            return tuple(obj[item] for item in items)
    return g

2.3 方法调用器

语法
operator.methodcaller(name, /, *args, **kwargs)

返回一个在操作数上调用 name 方法的可调用对象。如果给出额外的参数和/或关键字参数,它们也将被传给该方法。例如:

  • f = methodcaller('name') 之后,调用 f(b) 将返回 b.name()
  • f = methodcaller('name', 'foo', bar=1) 之后,调用 f(b) 将返回 b.name('foo', bar=1)
等价实现
def methodcaller(name, /, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller