2012-01-19 9 views
6

que tienen el siguiente código (menos algunas otras operaciones):forma recomendada para inicializar variable en si el bloque

def foobar(): 
    msg=None 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

es la siguiente mejor práctica para la variable msg?

def foobar(): 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

Soy consciente de que podía simplificar las funciones anteriores a las expresiones ternarias, sin embargo, hay operaciones en cada bloque if-else que he dejado fuera.

+0

Yo voto por la segunda. –

Respuesta

5

O debe estar bien pero probablemente hacer:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
0

Si lo que has mostrado es todo lo que implica el mensaje, entonces inicializarlo no hace nada por ti, y la segunda solución es mejor.

3

En Python no hay una gran ventaja de inicializar antes de un condicional como en su primer ejemplo. Solo necesita asegurarse de que la variable se inicialice antes de que se devuelva. Eso supone (basado en sus ejemplos) que está usando el paradigma de "punto de salida único". En algunos casos, en Python es apropiado, pero otras veces obtienes un código más limpio al salir temprano cuando sea posible.

def earlyReturn(mycheck): 
    if not mycheck: 
    return 'You forgot something.' 

    # code here if the test passes without needing an extra level of indentation. 
1

Definitivamente diría que cuanto más tarde esté mejor. No hay ninguna recomendación para que Python inicialice las variables. Por lo tanto, debe evitarse si no agrega algo de valor al código como un valor de reserva o hace que el código sea más legible, lo que no sucede en este caso.

Editar: Por valor de retorno quiero decir lo mismo que thagorn y mikebabcock ha sugerido.

0

Si eso es toda la lógica, por qué no hacer:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
2

Soy consciente de que hay algunas cosas que quedan fuera, pero si en realidad no es necesario manipular msg, me imagino que podría devolver los contenidos previstos, sin necesidad de una variable; return 'foo'

4

simplemente para la corrección, aquí son algunas de las alternativas de una sola línea a if/else bloques:

msg = 'foo' if foo else 'bar' 
msg = foo and 'foo' or 'bar' 
msg = ('bar', 'foo')[bool(foo)] 

El primero de ellos es sin duda la más clara, si no te gusta el de una sola línea I sugeriría usar su segundo método o la respuesta de Thagorn. La llamada bool() solo es necesaria en la última si foo aún no es un bool (o 0/1).

Obviamente, en su función de ejemplo que acaba podría devolver esta forma inmediata sin necesidad de utilizar una variable msg:

def foobar(): 
    return 'foo' if foo else 'bar' 
+0

En general, buenos y completos consejos, pero indicaron que hay más procesamiento en los bloques condicionales que solo eso. – DigitalMan

Cuestiones relacionadas