9.9. operator — Opérateurs standards en tant que fonctions

The operator module exports a set of efficient functions corresponding to the intrinsic operators of Python. For example, operator.add(x, y) is equivalent to the expression x+y. The function names are those used for special class methods; variants without leading and trailing __ are also provided for convenience.

The functions fall into categories that perform object comparisons, logical operations, mathematical operations, sequence operations, and abstract type tests.

Les fonctions de comparaison s’appliquent à tous les objets, et leur nom vient des opérateurs de comparaison qu’elles implémentent :

operator.lt(a, b)
operator.le(a, b)
operator.eq(a, b)
operator.ne(a, b)
operator.ge(a, b)
operator.gt(a, b)
operator.__lt__(a, b)
operator.__le__(a, b)
operator.__eq__(a, b)
operator.__ne__(a, b)
operator.__ge__(a, b)
operator.__gt__(a, b)

Perform « rich comparisons » between a and b. Specifically, lt(a, b) is equivalent to a < b, le(a, b) is equivalent to a <= b, eq(a, b) is equivalent to a == b, ne(a, b) is equivalent to a != b, gt(a, b) is equivalent to a > b and ge(a, b) is equivalent to a >= b. Note that unlike the built-in cmp(), these functions can return any value, which may or may not be interpretable as a Boolean value. See Comparaisons for more information about rich comparisons.

Nouveau dans la version 2.2.

En général, les opérations logiques s’appliquent aussi à tous les objets et implémentent les tests de vérité, d’identité et les opérations booléennes :

operator.not_(obj)
operator.__not__(obj)

Return the outcome of not obj. (Note that there is no __not__() method for object instances; only the interpreter core defines this operation. The result is affected by the __nonzero__() and __len__() methods.)

operator.truth(obj)

Renvoie True si obj est vrai, et False dans le cas contraire. Équivaut à utiliser le constructeur de bool.

operator.is_(a, b)

Renvoie a is b. Vérifie si les deux paramètres sont le même objet.

Nouveau dans la version 2.3.

operator.is_not(a, b)

Renvoie a is not b. Vérifie si les deux paramètres sont deux objets distincts.

Nouveau dans la version 2.3.

Les opérations mathématiques ou bit à bit sont les plus nombreuses :

operator.abs(obj)
operator.__abs__(obj)

Renvoie la valeur absolue de obj.

operator.add(a, b)
operator.__add__(a, b)

Renvoie a + ba et b sont des nombres.

operator.and_(a, b)
operator.__and__(a, b)

Renvoie le et bit à bit de a et b.

operator.div(a, b)
operator.__div__(a, b)

Return a / b when __future__.division is not in effect. This is also known as « classic » division.

operator.floordiv(a, b)
operator.__floordiv__(a, b)

Renvoie a // b.

Nouveau dans la version 2.2.

operator.index(a)
operator.__index__(a)

Renvoie a converti en entier. Équivaut à a.__index__().

Nouveau dans la version 2.5.

operator.inv(obj)
operator.invert(obj)
operator.__inv__(obj)
operator.__invert__(obj)

Renvoie l’inverse bit à bit du nombre obj. Équivaut à ~obj.

Nouveau dans la version 2.0: The names invert() and __invert__().

operator.lshift(a, b)
operator.__lshift__(a, b)

Renvoie le décalage de b bits vers la gauche de a.

operator.mod(a, b)
operator.__mod__(a, b)

Renvoie``a % b``.

operator.mul(a, b)
operator.__mul__(a, b)

Renvoie a * ba et b sont des nombres.

operator.neg(obj)
operator.__neg__(obj)

Renvoie l’opposé de obj (-obj).

operator.or_(a, b)
operator.__or__(a, b)

Renvoie le ou bit à bit de a et b.

operator.pos(obj)
operator.__pos__(obj)

Renvoie la valeur positive de obj (+obj).

operator.pow(a, b)
operator.__pow__(a, b)

Renvoie a ** ba et b sont des nombres.

Nouveau dans la version 2.3.

operator.rshift(a, b)
operator.__rshift__(a, b)

Renvoie le décalage de b bits vers la droite de a.

operator.sub(a, b)
operator.__sub__(a, b)

Renvoie a - b.

operator.truediv(a, b)
operator.__truediv__(a, b)

Return a / b when __future__.division is in effect. This is also known as « true » division.

Nouveau dans la version 2.2.

operator.xor(a, b)
operator.__xor__(a, b)

Renvoie le ou exclusif bit à bit de a et b.

Les opérations sur séquences (et pour certaines, sur correspondances) sont :

operator.concat(a, b)
operator.__concat__(a, b)

Renvoie a + ba et b sont des séquences.

operator.contains(a, b)
operator.__contains__(a, b)

Renvoie le résultat du test b in a. Notez que les opérandes sont inversées.

Nouveau dans la version 2.0: The name __contains__().

operator.countOf(a, b)

Renvoie le nombre d’occurrences de b dans a.

operator.delitem(a, b)
operator.__delitem__(a, b)

Renvoie la valeur de a à l’indice b.

operator.delslice(a, b, c)
operator.__delslice__(a, b, c)

Delete the slice of a from index b to index c-1.

Obsolète depuis la version 2.6: This function is removed in Python 3.x. Use delitem() with a slice index.

operator.getitem(a, b)
operator.__getitem__(a, b)

Renvoie la valeur de a à l’indice b.

operator.getslice(a, b, c)
operator.__getslice__(a, b, c)

Return the slice of a from index b to index c-1.

Obsolète depuis la version 2.6: This function is removed in Python 3.x. Use getitem() with a slice index.

operator.indexOf(a, b)

Renvoie l’indice de la première occurrence de b dans a.

operator.repeat(a, b)
operator.__repeat__(a, b)

Obsolète depuis la version 2.7: Use __mul__() instead.

Return a * b where a is a sequence and b is an integer.

operator.sequenceIncludes(...)

Obsolète depuis la version 2.0: Use contains() instead.

Alias for contains().

operator.setitem(a, b, c)
operator.__setitem__(a, b, c)

Affecte c dans a à l’indice b.

operator.setslice(a, b, c, v)
operator.__setslice__(a, b, c, v)

Set the slice of a from index b to index c-1 to the sequence v.

Obsolète depuis la version 2.6: This function is removed in Python 3.x. Use setitem() with a slice index.

Example use of operator functions:

>>> # Elementwise multiplication
>>> map(mul, [0, 1, 2, 3], [10, 20, 30, 40])
[0, 20, 60, 120]

>>> # Dot product
>>> sum(map(mul, [0, 1, 2, 3], [10, 20, 30, 40]))
200

Many operations have an « in-place » version. The following functions provide a more primitive access to in-place operators than the usual syntax does; for example, the statement x += y is equivalent to x = operator.iadd(x, y). Another way to put it is to say that z = operator.iadd(x, y) is equivalent to the compound statement z = x; z += y.

operator.iadd(a, b)
operator.__iadd__(a, b)

a = iadd(a, b) is equivalent to a += b.

Nouveau dans la version 2.5.

operator.iand(a, b)
operator.__iand__(a, b)

a = iand(a, b) is equivalent to a &= b.

Nouveau dans la version 2.5.

operator.iconcat(a, b)
operator.__iconcat__(a, b)

a = iconcat(a, b) is equivalent to a += b for a and b sequences.

Nouveau dans la version 2.5.

operator.idiv(a, b)
operator.__idiv__(a, b)

a = idiv(a, b) is equivalent to a /= b when __future__.division is not in effect.

Nouveau dans la version 2.5.

operator.ifloordiv(a, b)
operator.__ifloordiv__(a, b)

a = ifloordiv(a, b) is equivalent to a //= b.

Nouveau dans la version 2.5.

operator.ilshift(a, b)
operator.__ilshift__(a, b)

a = ilshift(a, b) is equivalent to a <<= b.

Nouveau dans la version 2.5.

operator.imod(a, b)
operator.__imod__(a, b)

a = imod(a, b) is equivalent to a %= b.

Nouveau dans la version 2.5.

operator.imul(a, b)
operator.__imul__(a, b)

a = imul(a, b) is equivalent to a *= b.

Nouveau dans la version 2.5.

operator.ior(a, b)
operator.__ior__(a, b)

a = ior(a, b) is equivalent to a |= b.

Nouveau dans la version 2.5.

operator.ipow(a, b)
operator.__ipow__(a, b)

a = ipow(a, b) is equivalent to a **= b.

Nouveau dans la version 2.5.

operator.irepeat(a, b)
operator.__irepeat__(a, b)

Obsolète depuis la version 2.7: Use __imul__() instead.

a = irepeat(a, b) is equivalent to a *= b where a is a sequence and b is an integer.

Nouveau dans la version 2.5.

operator.irshift(a, b)
operator.__irshift__(a, b)

a = irshift(a, b) is equivalent to a >>= b.

Nouveau dans la version 2.5.

operator.isub(a, b)
operator.__isub__(a, b)

a = isub(a, b) is equivalent to a -= b.

Nouveau dans la version 2.5.

operator.itruediv(a, b)
operator.__itruediv__(a, b)

a = itruediv(a, b) is equivalent to a /= b when __future__.division is in effect.

Nouveau dans la version 2.5.

operator.ixor(a, b)
operator.__ixor__(a, b)

a = ixor(a, b) is equivalent to a ^= b.

Nouveau dans la version 2.5.

The operator module also defines a few predicates to test the type of objects; however, these are not all reliable. It is preferable to test abstract base classes instead (see collections and numbers for details).

operator.isCallable(obj)

Obsolète depuis la version 2.0: Use isinstance(x, collections.Callable) instead.

Returns true if the object obj can be called like a function, otherwise it returns false. True is returned for functions, bound and unbound methods, class objects, and instance objects which support the __call__() method.

operator.isMappingType(obj)

Obsolète depuis la version 2.7: Use isinstance(x, collections.Mapping) instead.

Returns true if the object obj supports the mapping interface. This is true for dictionaries and all instance objects defining __getitem__().

operator.isNumberType(obj)

Obsolète depuis la version 2.7: Use isinstance(x, numbers.Number) instead.

Returns true if the object obj represents a number. This is true for all numeric types implemented in C.

operator.isSequenceType(obj)

Obsolète depuis la version 2.7: Use isinstance(x, collections.Sequence) instead.

Returns true if the object obj supports the sequence protocol. This returns true for all objects which define sequence methods in C, and for all instance objects defining __getitem__().

Le module operator définit aussi des fonctions pour la recherche générique d’attributs ou d’objets. Elles sont particulièrement utiles pour construire rapidement des accesseurs d’attributs à passer en paramètre à map(), sorted(), itertools.groupby() ou à toute autre fonction prenant une fonction en paramètre.

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

Renvoie un objet appelable qui récupère attr de son opérande. Si plus d’un attribut est demandé, renvoie un n-uplet d’attributs. Les noms des attributs peuvent aussi comporter des points. Par exemple :

  • Avec f = attrgetter('name'), l’appel f(b) renvoie b.name.

  • Avec f = attrgetter('name', 'date'), l’appel f(b) renvoie (b.name, b.date).

  • Après f = attrgetter('name.first', 'name.last'), l’appel f(b) renvoie (b.name.first, b.name.last).

Équivalent à :

def attrgetter(*items):
    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

Nouveau dans la version 2.4.

Modifié dans la version 2.5: Added support for multiple attributes.

Modifié dans la version 2.6: Added support for dotted attributes.

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

Renvoie un objet appelable qui récupère item de l’opérande en utilisant la méthode __getitem__(). Si plusieurs item sont passés en paramètre, renvoie un n-uplet des valeurs récupérées. Par exemple :

  • Avec f = itemgetter(2), f(r) renvoie r[2].

  • Avec g = itemgetter(2, 5, 3), g(r) renvoie (r[2], r[5], r[3]).

Équivalent à :

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

Les items en entrée peuvent être de n’importe quel type tant que celui-ci est géré par la méthode __getitem__() de l’opérande. Les dictionnaires acceptent toute valeur hachable. Les listes, n-uplets et chaînes de caractères acceptent un index ou une tranche :

>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1,3,5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2,None))('ABCDEFG')
'CDEFG'

Nouveau dans la version 2.4.

Modifié dans la version 2.5: Added support for multiple item extraction.

Exemple d’utilisation de itemgetter() pour récupérer des champs spécifiques d’un n-uplet :

>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
>>> getcount = itemgetter(1)
>>> map(getcount, inventory)
[3, 2, 5, 1]
>>> sorted(inventory, key=getcount)
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
operator.methodcaller(name[, args...])

Renvoie un objet appelable qui appelle la méthode name de son opérande. Si des paramètres supplémentaires et/ou des paramètres nommés sont donnés, ils seront aussi passés à la méthode. Par exemple :

  • Avec f = methodcaller('name'), f(b) renvoie b.name().

  • Avec f = methodcaller('name', 'foo', bar=1), f(b) renvoie b.name('foo', bar=1).

Équivalent à :

def methodcaller(name, *args, **kwargs):
    def caller(obj):
        return getattr(obj, name)(*args, **kwargs)
    return caller

Nouveau dans la version 2.6.

9.9.1. Correspondances entre opérateurs et fonctions

Le tableau montre la correspondance entre les symboles des opérateurs Python et les fonctions du module operator.

Opération

Syntaxe

Fonction

Addition

a + b

add(a, b)

Concaténation

seq1 + seq2

concat(seq1, seq2)

Test d’inclusion

obj in seq

contains(seq, obj)

Division

a / b

div(a, b) (without __future__.division)

Division

a / b

truediv(a, b) (with __future__.division)

Division

a // b

floordiv(a, b)

Et bit à bit

a & b

and_(a, b)

Ou exclusif bit à bit

a ^ b

xor(a, b)

Inversion bit à bit

~ a

invert(a)

Ou bit à bit

a | b

or_(a, b)

Exponentiation

a ** b

pow(a, b)

Identité

a is b

is_(a, b)

Identité

a is not b

is_not(a, b)

Affectation par index

obj[k] = v

setitem(obj, k, v)

Suppression par index

del obj[k]

delitem(obj, k)

Indexation

obj[k]

getitem(obj, k)

Décalage bit à bit gauche

a << b

lshift(a, b)

Modulo

a % b

mod(a, b)

Multiplication

a * b

mul(a, b)

Opposé

- a

neg(a)

Négation (logique)

not a

not_(a)

Valeur positive

+ a

pos(a)

Décalage bit à bit droite

a >> b

rshift(a, b)

Sequence Repetition

seq * i

repeat(seq, i)

Affectation par tranche

seq[i:j] = values

setitem(seq, slice(i, j), values)

Suppression par tranche

del seq[i:j]

delitem(seq, slice(i, j))

Tranche

seq[i:j]

getitem(seq, slice(i, j))

Formatage de chaînes de caractères

s % obj

mod(s, obj)

Soustraction

a - b

sub(a, b)

Test de véracité

obj

truth(obj)

Ordre

a < b

lt(a, b)

Ordre

a <= b

le(a, b)

Égalité

a == b

eq(a, b)

Différence

a != b

ne(a, b)

Ordre

a >= b

ge(a, b)

Ordre

a > b

gt(a, b)