2012-07-22 9 views
7

Sto seguendo il corso di Web Application Engineering su Udacity. Ho notato che l'istruttore utilizza l'operatore and nella dichiarazione return nel suo metodo di convalida. E non ho capito come sia possibile restituire 2 argomenti. Penso che potrebbe essere qualcosa come la dichiarazione if. Qualcuno potrebbe spiegare cosa sia in realtà?Utilizzo di "e" in risposta

Ecco il metodo di validazione:

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$") 
def valid_username(username): 
    return username and USER_RE.match(username) 

Grazie in anticipo.

+0

'return aeb significa 'return (aeb)' i.e. x = a eb; return x' – katrielalex

+2

Come indicato sotto, questo non restituisce due argomenti. Tuttavia, in Python, è molto facile restituire una tupla di due elementi, che può essere utile in altri contesti. –

+1

Un altro modo per scriverlo: 'return USER_RE.match (username) se username else username' –

risposta

12

L'operatore and valuta se entrambi i suoi argomenti sono tru-ish, ma in un modo un po 'sorprendente: prima esamina il suo argomento di sinistra. Se è vero, restituisce la giusta argomentazione. Se l'argomento di sinistra è falso, restituisce l'argomento di sinistra.

Così l'ultima riga nel codice:

return username and USER_RE.match(username) 

è lo stesso:

if username: 
    return USER_RE.match(username) 
else: 
    return username 

stringhe come username sono truish se non sono vuoti. La funzione regex match restituisce un oggetto corrispondenza truish se il modello corrisponde e restituisce None, un valore falso, se non corrisponde.

Il risultato netto è che valid_username restituirà un valore True se il nome utente non è una stringa vuota e il nome utente corrisponde al modello specificato.

Nota "e" qui non ha nulla a che fare con la restituzione di due valori, sta calcolando un valore.

+0

+1 per la bella spiegazione chiara – Levon

2

Quando si utilizza un operatore logico, esso continua secondo le regole, quindi con e, valuta la veridicità della prima affermazione e se non è vero, restituisce un valore non attendibile (nel primo caso , '').

print repr("" and "THIS IS POST AND") 
"" 

print "" or "THIS IS POST AND" 
THIS IS POST AND 

print None or "Something else" 
Something else 

Dove questo è utile è quando non si vuole chiamare un metodo inesistente su qualcosa come None (ad esempio, il tratto di lunghezza):

r = None 

s = [1,2,3,4] 

print r and len(r) 
None 

print s and len(s) 
4 

Nel caso che hai postato, il punto è che vuoi solo controllare il nome utente rispetto all'espressione regolare se il nome utente è veritiero.

È importante notare che and e or cortocircuitano entrambi. Quindi se ottieni qualcosa di non veritiero, la funzione non valuterà nemmeno l'espressione regolare.

0

and è solo un operatore binario. return a and b è strutturalmente uguale a return a + b o return a * b e funziona allo stesso modo. L'espressione viene valutata, quindi il suo risultato viene assegnato a return, che lo restituisce al chiamante. Non c'è niente di speciale nell'usare and in una dichiarazione return.

Come spiegato molto bene dalla risposta di Ned, il risultato di a and b è vero-ish se entrambi a e b sono vere-ish, e falso-ish altrimenti.Inoltre cortocircuito se l'argomento di sinistra è false-ish, poiché ciò è sufficiente per determinare il risultato dell'intera espressione a and b.

In questo caso, una stringa vuota non corrisponde a tale espressione regolare, pertanto l'operazione è ridondante considerata puramente come logica. Ho il forte sospetto che sia usato qui perché username potrebbe avere il valore None, il che farebbe sì che la corrispondenza di espressioni regolari generasse un'eccezione. L'utilizzo di username and USER_RE.match(username) anziché solo USER_RE.match(username) significa che qualsiasi valore falso (incluso None) per username fa sì che la funzione restituisca qualcosa di falso-ish senza nemmeno tentare la corrispondenza dell'espressione regolare.

Ma ancora una volta, questo non ha nulla a che fare con return, è proprio come funziona and.

0

Per quelli che iniziano ad imparare python, trovo che questa affermazione è difficile da capire

nome utente e ritorno USER_RE.match (nome utente)

ciò che dobbiamo notare è che prima, questo metodo restituirà booleano (o restituisce False o True) non restituisce la stringa "nomeutente"

quindi la semplice comprensione è questa: se il nome utente non è vuoto e il nome utente supera la convalida regex, restituisce True, altrimenti restituisce False

Problemi correlati