2012-07-30 15 views
12

que tienen algunos si las declaraciones como:expresiones condicionales larga dividida por líneas a

def is_valid(self): 
    if (self.expires is None or datetime.now() < self.expires) 
    and (self.remains is None or self.remains > 0): 
     return True 
    return False 

Cuando escribo esto Expresiones mi Vim se mueve automáticamente a la nueva línea and con este mismo punto que if línea. Intento más combinaciones de sangría, pero la validación siempre dice que es una sintaxis inválida. ¿Cómo construir long if?

+5

Solo un comentario, no es necesario tener una declaración 'if' en su ejemplo. Podrías simplemente 'regresar (self.expires es None o datetime.now() ...)' – mgilson

+0

Estoy aprendiendo Python y supongo que puedo hacerlo pero no me siento tan bien. Gracias mgilson – kbec

Respuesta

20

Agregue un nivel adicional de corchetes alrededor de todo el estado. Esto le permitirá insertar saltos de línea como desee.

if (1+1==2 
    and 2 < 5 < 7 
    and 2 != 3): 
    print 'yay' 

En cuanto al número real de espacios para el uso, el Python Style Guide no obliga a nada, pero da algunas ideas:

# No extra indentation. 
if (this_is_one_thing and 
    that_is_another_thing): 
    do_something() 

# Add a comment, which will provide some distinction in editors 
# supporting syntax highlighting. 
if (this_is_one_thing and 
    that_is_another_thing): 
    # Since both conditions are true, we can frobnicate. 
    do_something() 

# Add some extra indentation on the conditional continuation line. 
if (this_is_one_thing 
     and that_is_another_thing): 
    do_something() 
3

poner los saltos de línea dentro de los paréntesis if ((....) and (...)):

3

Usted podría invertido las pruebas y el resultado Falso en los subconjuntos de la prueba:

def is_valid(self): 
    if self.expires is not None and datetime.now() >= self.expires: 
     return False 
    if self.remains is not None and self.remains <= 0: 
     return False 
    return True 

De esta forma puede romper la larga lista de pruebas y hacer que todo sea mucho más legible.

Sí, puede usar paréntesis adicionales alrededor de sus pruebas booleanas para permitir nuevas líneas en la prueba, pero la legibilidad sufre mucho cuando tiene que pasar por varias líneas.

+0

Gracias, pero, ¿es esto realmente más legible? Un 'si' lógicamente pirateado es más legible para mí; puedo tratarlo como muchos ifs con una declaración de resultados compartida. – kbec

+4

Sí, absolutamente. Tienes 2 razones lógicamente no relacionadas para que tu contenido no sea válido. O bien ha expirado, o bien ha llegado a 0. ¿Qué pasa si en el futuro hay más razones? Mantener estos separados aumenta la legibilidad y el mantenimiento. –

+0

Quizás tengas razón si hay más razones. – kbec

Cuestiones relacionadas