operator
— Standard operators as functions¶
Código fuente: Lib/operator.py
El módulo operator
exporta un conjunto de funciones eficientes correspondientes a los operadores intrínsecos de Python. Por ejemplo, operator.add(x, y)
es equivalente a la expresión x+y
. Muchos nombres de función son los utilizados para métodos especiales, sin los dobles guiones bajos. Por compatibilidad con versiones anteriores, muchos de estos tienen una variante que conserva los dobles guiones bajos . Se prefieren las variantes sin los dobles guiones bajos para mayor claridad.
Las funciones se dividen en categorías que realizan comparaciones de objetos, operaciones lógicas, operaciones matemáticas y operaciones sobre secuencias.
Las funciones de comparación de objetos son útiles para todos los objetos, y llevan el nombre de los operadores de comparación enriquecida que soportan:
- 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)¶
Realiza «comparaciones enriquecidas» entre a y b. Específicamente,
lt(a, b)
es equivalente aa < b
,le(a, b)
es equivalente aa <= b
,eq(a, b)
es equivalente aa == b
,ne(a, b)
es equivalente aa != b
,gt(a, b)
es equivalente aa > b
yge(a, b)
es equivalente aa >= b
. Tenga en cuenta que estas funciones pueden retornar cualquier valor, que puede o no ser interpretable como un valor booleano. Consulte Comparaciones para obtener más información sobre las comparaciones enriquecidas.
Las operaciones lógicas también son aplicables a todos los objetos, y admiten pruebas de verdad, pruebas de identidad y operaciones booleanas:
- operator.not_(obj)¶
- operator.__not__(obj)¶
Retorna el resultado de
not
obj. (Tenga en cuenta que no hay ningún método__not__()
para las instancias de objeto; solo el núcleo del intérprete define esta operación. El resultado se ve afectado por los métodos__bool__()
y__len__()
.)
- operator.truth(obj)¶
Retorna
True
si obj es verdadero, yFalse
de lo contrario. Esto equivale a usar el constructorbool
.
- operator.is_(a, b)¶
Retorna
a is b
. Chequea la identidad del objeto.
- operator.is_not(a, b)¶
Retorna
a is not b
. Chequea la identidad del objeto.
- operator.is_none(a)¶
Return
a is None
. Tests object identity.Added in version 3.14.
- operator.is_not_none(a)¶
Return
a is not None
. Tests object identity.Added in version 3.14.
Las operaciones matemáticas y a nivel de bits son las más numerosas:
- operator.and_(a, b)¶
- operator.__and__(a, b)¶
Retorna la «conjunción bit a bit» (bitwise and) de a y b.
- operator.index(a)¶
- operator.__index__(a)¶
Retorna a convertido a un número entero. Equivalente a
a.__index__()
.Distinto en la versión 3.10: El resultado siempre tiene el tipo exacto
int
. Anteriormente, el resultado podría haber sido una instancia de una subclase deint
.
- operator.inv(obj)¶
- operator.invert(obj)¶
- operator.__inv__(obj)¶
- operator.__invert__(obj)¶
Retorna el «inverso bit a bit» (bitwise inverse) del número obj. Esto es equivalente a
~obj
.
- operator.lshift(a, b)¶
- operator.__lshift__(a, b)¶
Retorna a desplazado a izquierda (shift left) b bits.
- operator.rshift(a, b)¶
- operator.__rshift__(a, b)¶
Retorna a desplazado a derecha (shift right) b bits.
- operator.truediv(a, b)¶
- operator.__truediv__(a, b)¶
Retorna
a / b
donde 2/3 es .66 en lugar de 0. Esto también se conoce como división «real» (true division).
- operator.xor(a, b)¶
- operator.__xor__(a, b)¶
Retorna la disyunción exclusiva bit a bit (bitwise exclusive or) de a y b.
Las operaciones que funcionan con secuencias (y algunas de ellas también con mapeos) incluyen:
- operator.contains(a, b)¶
- operator.__contains__(a, b)¶
Retorna el resultado del chequeo
b in a
. Notar que los operandos se invirtieron.
- operator.countOf(a, b)¶
Retorna el número de ocurrencias de b en a.
- operator.indexOf(a, b)¶
Retorna el índice de la primera ocurrencia de b en a.
- operator.setitem(a, b, c)¶
- operator.__setitem__(a, b, c)¶
Establece el valor de a en el índice b a c.
- operator.length_hint(obj, default=0)¶
Retorna un largo estimativo del objeto obj. Primero intenta retornar su largo real, luego un estimativo usando
object.__length_hint__()
, y finalmente retorna un valor predeterminado.Added in version 3.4.
La siguiente operación funciona con invocables:
- operator.call(obj, /, *args, **kwargs)¶
- operator.__call__(obj, /, *args, **kwargs)¶
Retorna
obj(*args, **kwargs)
.Added in version 3.11.
El módulo operator
también define herramientas para la obtención generalizada de atributos e ítems. Estas herramientas son útiles para utilizar rápidamente extractores de campos como argumentos de map()
, sorted()
, itertools.groupby()
, u otras funciones que esperan una función como argumento.
- operator.attrgetter(attr)¶
- operator.attrgetter(*attrs)
Retorna un objeto invocable que obtiene attr de su operando. Si se solicita más de un atributo, retorna una tupla de los atributos. Los nombres de los atributos también pueden contener puntos. Por ejemplo:
Después de
f = attrgetter('name')
, la llamadaf(b)
retornab.name
.Después de
f = attrgetter('name', 'date')
, la llamadaf(b)
retorna(b.name, b.date)
.Después de
f = attrgetter('name.first', 'name.last')
, la llamadaf(b)
retorna(b.name.first, b.name.last)
.
Equivalente a:
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
- operator.itemgetter(item)¶
- operator.itemgetter(*items)
Return a callable object that fetches item from its operand using the operand’s
__getitem__()
method. If multiple items are specified, returns a tuple of lookup values. For example:Después de
f = itemgetter(2)
, la llamadaf(r)
retornar[2]
.Después de
g = itemgetter(2, 5, 3)
, la llamadag(r)
retorna(r[2], r[5], r[3])
.
Equivalente a:
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
The items can be any type accepted by the operand’s
__getitem__()
method. Dictionaries accept any hashable value. Lists, tuples, and strings accept an index or a slice:>>> 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'
Ejemplos que utilizan
itemgetter()
para obtener campos específicos de un registro tupla:>>> inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)] >>> getcount = itemgetter(1) >>> list(map(getcount, inventory)) [3, 2, 5, 1] >>> sorted(inventory, key=getcount) [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]
- operator.methodcaller(name, /, *args, **kwargs)¶
Retorna un objeto invocable que a su vez invoca al método name sobre su operando. Si se pasan argumentos adicionales y/o argumentos por palabra clave, estos serán a su vez pasados al método. Por ejemplo:
Después de
f = methodcaller('name')
, la llamadaf(b)
retornab.name()
.Después de
f = methodcaller('name', 'foo', bar=1)
, la llamadaf(b)
retornab.name('foo', bar=1)
.
Equivalente a:
def methodcaller(name, /, *args, **kwargs): def caller(obj): return getattr(obj, name)(*args, **kwargs) return caller
Asignación de operadores a funciones¶
Esta tabla muestra cómo operaciones abstractas se corresponden con operadores simbólicos en la sintaxis de Python y las funciones en el módulo operator
.
Operación |
Sintaxis |
Función |
---|---|---|
Adición |
|
|
Concatenación |
|
|
Chequeo de pertenencia |
|
|
División |
|
|
División |
|
|
Conjunción lógica bit a bit (bitwise and) |
|
|
Disyunción lógica bit a bit (bitwise exclusive or) |
|
|
Inversión bit a bit (bitwise inversion) |
|
|
Disyunción lógica bit a bit (bitwise or) |
|
|
Exponenciación |
|
|
Identidad |
|
|
Identidad |
|
|
Identidad |
|
|
Identidad |
|
|
Asignación indexada |
|
|
Eliminación indexada |
|
|
Indexado |
|
|
Desplazamiento a izquierda (left shift) |
|
|
Módulo |
|
|
Multiplicación |
|
|
Multiplicación de matrices |
|
|
Negación (aritmética) |
|
|
Negación (lógica) |
|
|
Positivo |
|
|
Desplazamiento a derecha (right shift) |
|
|
Asignación por segmento |
|
|
Eliminación por segmento |
|
|
Segmentación |
|
|
Formateo de cadenas |
|
|
Sustracción |
|
|
Chequeo de verdad |
|
|
Ordenado |
|
|
Ordenado |
|
|
Igualdad |
|
|
Diferencia |
|
|
Ordenado |
|
|
Ordenado |
|
|
Operadores In-place¶
Muchas operaciones tienen una versión «in-place». Abajo se listan las funciones que proveen un acceso más primitivo a operadores in-place que la sintaxis usual; por ejemplo, el statement x += y
es equivalente a x = operator.iadd(x, y)
. Otra forma de decirlo es que z = operator.iadd(x, y)
es equivalente a la sentencia (statement) compuesta z = x; z += y
.
En esos ejemplo, notar que cuando se invoca un método in-place, el cómputo y la asignación se realizan en dos pasos separados. Las funciones in-place que se listan aquí debajo solo hacen el primer paso, llamar al método in-place. El segundo paso, la asignación, no se gestiona.
Para objetivos inmutables como cadenas de caracteres, números, y tuplas, el valor actualizado es computado, pero no es asignado de nuevo a la variable de entrada:
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
Para objetivos mutables como listas y diccionarios, el método in-place realiza la actualización, así que no es necesaria una asignación subsiguiente:
>>> s = ['h', 'e', 'l', 'l', 'o']
>>> iadd(s, [' ', 'w', 'o', 'r', 'l', 'd'])
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> s
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
- operator.iconcat(a, b)¶
- operator.__iconcat__(a, b)¶
a = iconcat(a, b)
es equivalente aa += b
para dos a y b secuencias.
- operator.ifloordiv(a, b)¶
- operator.__ifloordiv__(a, b)¶
a = ifloordiv(a, b)
es equivalente aa //= b
.