3.10 operator -- Operatori standard come funzioni

Il modulo operator esporta un insieme di funzioni implementate in C che corrispondono agli operatori intrinseci di Python. Per esempio, operator.add(x, y) è equivalente all'espressione x+y. I nomi delle funzioni sono quelli usati per i metodi speciali di classe; varianti senza il segno "__" in testa o in coda vengono inoltre fornite per convenienza.

Le funzioni rientrano in categorie che eseguono confronti tra oggetti, operazioni logiche, operazioni matematiche, operazioni sulle sequenze e verifiche su tipi astratti.

Le funzioni di confronto degli oggetti sono utili per tutti gli oggetti, e prendono il nome dall'operatore di confronto ricco che supportano:

lt( a, b)
le( a, b)
eq( a, b)
ne( a, b)
ge( a, b)
gt( a, b)
__lt__( a, b)
__le__( a, b)
__eq__( a, b)
__ne__( a, b)
__ge__( a, b)
__gt__( a, b)
Eseguono ``confronti ricchi'' tra a e b. Nello specifico, lt(a, b) è equivalente a a < b, le(a, b) è equivalente a a <= b, eq(a, b) è equivalente a a == b, ne(a, b) è equivalente a a != b, gt(a, b) è equivalente a a > b e ge(a, b) è equivalente a a >= b. Notate che, diversamente dalla built-in cmp(), queste funzioni possono restituire qualunque valore, che può venire intrepretato o meno come booleano. Fate riferimento al Python Reference Manual per maggiori informazioni riguardo i confronti ricchi. Nuovo nella versione 2.2.

Le operazioni logiche sono in genere applicabili a tutti gli oggetti e supportano test della verità, test sull'identità e operazioni booleane:

not_( o)
__not__( o)
Restituisce il risultato di not o. (Notate che non esiste il metodo __not__() per oggetti istanze; solo il nucleo dell'interprete definisce questa operazione. Il risultato viene influenzato dai metodi __nonzero__() e __len__().)

truth( o)
Restituisce True se o è vero, altrimenti False. Questo è equivalente all'uso del costruttore bool.

is_( a, b)
Restituisce a is b. Verifica l'identità di oggetti. Nuovo nella versione 2.3.

is_not( a, b)
Restituisce a is not b. Verifica l'identità di oggetti.

Nuovo nella versione 2.3.

Le operazioni matematiche e bit per bit sono le più numerose:

abs( o)
__abs__( o)
Restituisce il valore assoluto di o.

add( a, b)
__add__( a, b)
Restituisce a + b, per a e b numerici.

and_( a, b)
__and__( a, b)
Restituisce l'and bit per bit di a e b.

div( a, b)
__div__( a, b)
Restituisce a / b quando __future__.division non viene effettuata. Questa è anche conosciuta come divisione ``classica''.

floordiv( a, b)
__floordiv__( a, b)
Restituisce a // b. Nuovo nella versione 2.2.

inv( o)
invert( o)
__inv__( o)
__invert__( o)
Restitusce l'inverso bit per bit del numero o. Questo è l'equivalente di ~o. I nomi invert() e __invert__() sono stati aggiunti in Python 2.0.

lshift( a, b)
__lshift__( a, b)
Restituisce lo scorrimento a sinistra di a di b bit.

mod( a, b)
__mod__( a, b)
Restituisce a % b.

mul( a, b)
__mul__( a, b)
Restituisce a * b, per i numeri a e b.

neg( o)
__neg__( o)
Restituisce la negativizzazione di o.

or_( a, b)
__or__( a, b)
Restituisce l'or bit per bit di a e b.

pos( o)
__pos__( o)
Restituisce il positivo di o.

pow( a, b)
__pow__( a, b)
Restituisce a ** b, per i numeri a e b. Nuovo nella versione 2.3.

rshift( a, b)
__rshift__( a, b)
Restituisce lo scorrimento a destra di a di b bit.

sub( a, b)
__sub__( a, b)
Restituisce a - b.

truediv( a, b)
__truediv__( a, b)
Restituisce a / b quando __future__.division viene effettuata. Questa è anche conosciuta come divisione. Nuovo nella versione 2.2.

xor( a, b)
__xor__( a, b)
Restituisce l'or bit per bit esclusivo di a e b.

Le operazioni che lavorano con sequenze includono:

concat( a, b)
__concat__( a, b)
Restituisce a + b per le sequenza a e b.

contains( a, b)
__contains__( a, b)
Restituisce il risultato del test b in a. Notate gli operatori inversi. La definizione __contains__() è stata aggiunta in Python 2.0.

countOf( a, b)
Restituisce il numero delle occorrenze di b in a.

delitem( a, b)
__delitem__( a, b)
Rimuove il valore di a nell'indice b.

delslice( a, b, c)
__delslice__( a, b, c)
Cancella la fetta di a dall'indice b all'indice c-1.

getitem( a, b)
__getitem__( a, b)
Restituisce il valore di a nell'indice b.

getslice( a, b, c)
__getslice__( a, b, c)
Restituisce la fetta di a dall'indice b all'indice c-1.

indexOf( a, b)
Restituisce l'indice della prima occorrenza di b in a.

repeat( a, b)
__repeat__( a, b)
Restituisce a * b quando a è una sequenza e b è un intero.

sequenceIncludes( ...)
Deprecato dalla versione 2.0 di Python. Al suo posto usate contains().
Alias per contains().

setitem( a, b, c)
__setitem__( a, b, c)
Imposta il valore di a dall'indice b a c.

setslice( a, b, c, v)
__setslice__( a, b, c, v)
Imposta la fetta di a dall'indice b all'indice c-1 alla sequenza v.

Il modulo operator definisce anche alcuni predicati per verificare il tipo degli oggetti. Note: Va fatta attenzione a non interpretare erroneamente i risultati di queste funzioni; solo isCallable() ha le caratteristiche per essere attendibile con oggetti istanza. Per esempio:

>>> class C:
...     pass
... 
>>> import operator
>>> o = C()
>>> operator.isMappingType(o)
True

isCallable( o)
Deprecato dalla versione 2.0 di Python. In sostituzione usate la funzione built-in callable().
Restituisce vero se l'oggetto o può venire chiamato come una funzione, altrimenti falso. Vero viene restituito per funzioni, metodi bound e unbound, classi di oggetti e oggetti istanze che supportino il metodo __call__()

isMappingType( o)
Restituisce vero se l'oggetto o supporta l'interfaccia di mapping. Questo è vero per i dizionari e per tutti gli oggetti istanza. Non esiste un metodo affidabile per verificare se una istanza supporta l'intero protocollo di mapping fintanto che l'interfaccia stessa non viene definita correttamente. Questo rende il test meno utile di quanto altrimenti potrebbe essere.

isNumberType( o)
Restituisce vero se l'oggetto o rappresenta un numero. Questo è vero per tutti i tipi numerici implementati in C, e per tutti gli oggetti istanza. Non esiste un metodo affidabile per verificare se una istanza supporta l'interfaccia numerica in modo completo fintanto che la classe stessa non viene definita correttamente. Questo rende il test meno utile di quanto altrimenti potrebbe essere.

isSequenceType( o)
Restituisce valore vero se l'oggetto o supporta il protocollo della sequenza. Restituisce vero per tutti gli oggetti che definiscono una sequenza con i metodi del linguaggio C e per tutti gli altri oggetti istanza. Non esiste un metodo affidabile per verificare se un'istanza supporta l'interfaccia per la sequenza in modo completo fintanto che l'interfaccia stessa non viene definita correttamente. Questo rende il test meno utile di quanto altrimenti potrebbe essere.

Esempio : Costruite un dizionario che mappi gli ordinali da 0 a 256 nei loro caratteri equivalenti.

>>> import operator
>>> d = {}
>>> keys = range(256)
>>> vals = map(chr, keys)
>>> map(operator.setitem, [d]*len(keys), keys, vals)

Il modulo operator definisce inoltre gli strumenti per attributi generalizzati e per l'aspetto degli elementi. Questo è molto utile per creare velocemente estrattori di campi come argomenti per map(), sorted(), itertools.groupby(), o per altre funzioni che aspettano una funzione in argomento.

attrgetter( attr)
Restituisce un oggetto chiamabile che recupera attr dal proprio operando. Dopo "f=attrgetter('name')", la chiamata "f(b)" restituisce "b.name". Nuovo nella versione 2.4.

itemgetter( elemento)
Restituisce un oggetto chiamabile che recupera elemento dal proprio operando. Dopo "f=itemgetter(2)" la chiamata "f(b)" restituisce "f(b)". Nuovo nella versione 2.4.

Esempi:

>>> from operator import *
>>> 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)]



Subsections
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.