2011-09-22 18 views
7

Aquí está mi situación:Python cómo comprobar si existe una variable y su longitud, en una declaración if?

if var: 
    if len(var) == 5: 
     do something... 
else: 
    do the same thing... 

Para evitar la repetición de la misma pieza de código, me gustaría combinar esos 2 si las condiciones, todo en uno. Pero si var es None, no puedo verificar su longitud ... ¿Alguna idea? me gustaría algo como esto:

if var and len(var) == 5: 
    do something... 
+4

Lo que sugirió está bien. 'if var and len (var) == 5' funcionará –

+0

Además de lo que todos ya dijeron (es decir, que su sugerencia realmente funciona como espera), ¿por qué está buscando longitud si va a hacer lo mismo de todos modos? También tenga en cuenta que, en general, cuando tiene un cuerpo de código que no quiere repetir, la herramienta que debe usar es una función o un método (dependiendo de cuánto contexto necesite el código). – 6502

+0

No debería hacer preguntas por la noche, con la esperanza de obtener una respuesta por la mañana ... Estaba seguro de que lo intenté y no funcionó ... – Tickon

Respuesta

14

¿Usted intentó que? Funciona:

if var and len(var) == 5: 
    .... 

El and operador no evalúa la RHS si el LHS es falsa. Prueba esto:

>>> False and 1/0 
False 
>>> True and 1/0 
ZeroDivisionError: division by zero 
+0

si var no existe, quiere hacer algo como ¿bueno no? – steabert

+2

@steabert: Agregue 'not' o' else' a su código como mejor le parezca. No estoy aquí para escribir tu código, solo para responder preguntas. –

+0

Hay un inconveniente aquí (que podría o no ser relevante para @Tickon): esta solución no discrimina entre los casos 'var == []' y 'var is None'.En el primer caso, 'len (var)' puede determinarse ('== 0'), en este último no puede. (Sin embargo, no creo que esta sea una razón para rechazar esta respuesta) –

3

El código que has escrito en la pregunta ejecuta las sentencias en dos casos:

  • var se evalúa como verdadera y tiene una longitud de 5
  • var evalúa a falso (por ejemplo, que es None o False)

se pueden combinar los en una condicional de la siguiente manera:

if not var or len(var) == 5: 
    ... 

El condicional que algunas otras respuestas están sugiriendo, var and len(var) == 5, sólo se evalúa a True en el primer caso, no el segundo. Diré, sin embargo, que los dos casos que ha elegido son una combinación inusual. ¿Está seguro de que no tenía la intención de ejecutar las declaraciones solo si la variable tiene un valor no falso y tiene una longitud de 5?

Además, como escribió 6502 en un comentario, las funciones están destinadas exactamente para este caso, es decir, para hacer bloques de código reutilizables. Así que otra solución fácil sería

def f(): 
    .... 
if var: 
    if var.length == 5: 
     f() 
else: 
    f() 
0

Bueno, las excepciones parecen estar perfectamente bien aquí.

try: 
    if len(var) == 5: 
     do_something() 
except TypeError: 
    pass 

¿Estás diciendo que var puede ser nulo, por lo tanto, una excepción TypeError se vieran afectadas. Sin embargo, si, de hecho, var puede no existir en absoluto, debe detectar la excepción NameError.

+0

Esta es la solución que hace exactamente lo que pide @Tickon. Solo si 'var es None' (o un tipo diferente no subscriptable, pero que no se solicitó aquí), la excepción se activará. Y es más Pythonic por lo que vale. –

Cuestiones relacionadas