2012-07-22 15 views
7

Estoy tomando un curso de Ingeniería de aplicaciones web en Udacity. Noté que el instructor usa el operador and en la declaración return en su método de validación. Y no entendí cómo es posible devolver 2 argumentos. Creo que puede ser algo como la declaración if. ¿Alguien podría explicar lo que realmente es?Usando "y" a cambio

Aquí es el método de validación:

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

Gracias de antemano.

+0

'return a and b' significa' return (a y b) 'es decir' x = a y b; return x' – katrielalex

+2

Como indican las respuestas a continuación, esto no devuelve dos argumentos. Sin embargo, en Python, es muy fácil devolver una tupla de dos elementos, que puede ser útil en otros contextos. –

+1

Otra forma de escribirlo: 'return USER_RE.match (username) if username else username' –

Respuesta

12

El operador and evalúa si ambos argumentos son tru-ish, pero de una manera ligeramente sorprendente: Primero examina su argumento de la izquierda. Si es truish, entonces devuelve su argumento correcto. Si el argumento de la izquierda es falso, entonces devuelve el argumento de la izquierda.

Así que la última línea en el código:

return username and USER_RE.match(username) 

es lo mismo que:

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

cadenas como username son Truish si no están vacíos. La función regex match devuelve un objeto de concordancia truish si el patrón coincide y devuelve None, un valor false, si no coincide.

El resultado neto es que valid_username devolverá un valor truish si el nombre de usuario no es una cadena vacía, y el nombre de usuario coincide con el patrón dado.

Tenga en cuenta que el "y" aquí no tiene nada que ver con la devolución de dos valores, sino que está calculando un valor.

+0

+1 para una explicación clara y agradable – Levon

2

Cuando utiliza un operador lógico, continúa de acuerdo con las reglas, por lo que con y, evalúa la veracidad de la primera declaración y si no es verdad, devuelve un valor no verdadero (en el primer 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 

Cuando esto viene muy bien es cuando usted no quiere llamar a un método inexistente en algo como None (por ejemplo, el rasgo de longitud):

r = None 

s = [1,2,3,4] 

print r and len(r) 
None 

print s and len(s) 
4 

En el caso informados, el punto es que solo quieres verificar el nombre de usuario contra la expresión regular si el nombre de usuario es verdadero.

Es importante señalar aquí que and y or ambos cortocircuitos. Entonces, si obtienes algo que no sea cierto, la función ni siquiera evaluará la expresión regular.

0

and es solo un operador binario. return a and b es estructuralmente el mismo que return a + b o return a * b, y funciona de la misma manera. La expresión se evalúa, luego su resultado se da a return, que lo devuelve a la persona que llama. No hay nada especial en usar and en una declaración return.

Como se explica muy bien por la respuesta de Ned, el resultado de a and b es cierto-ish si ambos a y b son verdaderas-ish, y falsos ish lo contrario.También produce un cortocircuito si el argumento de la izquierda es falso-ish, ya que eso es suficiente para determinar el resultado de la expresión completa a and b.

En este caso, una cadena vacía no coincidiría con esa expresión regular, por lo que la operación es redundante considerada puramente como lógica. Sin embargo, sospecho que se está utilizando aquí porque username podría tener el valor None, lo que provocaría que la coincidencia de expresión regular arrojara una excepción. Usar username and USER_RE.match(username) en lugar de solo USER_RE.match(username) significa que cualquier valor de falso falso (incluido None) para username hace que la función devuelva algo falso sin siquiera intentar la coincidencia de expresiones regulares.

Pero, una vez más, esto no tiene nada que ver con return, así es como funciona and.

0

Para los que empiezan a aprender Python, me parece que esta afirmación es difícil de entender

nombre de usuario retorno y USER_RE.match (nombre de usuario)

lo que hay que notar es que en primer lugar, este método devolverá boolean (ya sea devolver Falso o Verdadero) no devuelve la cadena "nombre de usuario"

por lo que la comprensión simple es la siguiente: si nombre de usuario no está vacío y el nombre de usuario pasa la validación regex, devuelve True, de lo contrario, devuelve False

Cuestiones relacionadas