Debido a las reglas de alcance de Python, todas las variables una vez inicializadas dentro de un alcance están disponibles a partir de entonces. Como los condicionales no introducen un nuevo ámbito, las construcciones en otros lenguajes (como la inicialización de una variable antes de esa condición) no son necesariamente necesarias. Por ejemplo, podríamos tener:¿Cuál es la forma pitonica de inicialización de variable condicional?
def foo(optionalvar = None):
# some processing, resulting in...
message = get_message()
if optionalvar is not None:
# some other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
o, podríamos tener lugar:
def foo(optionalvar = None):
if optionalvar is None:
# processing, resulting in...
message = get_message()
else:
# other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
Por supuesto, los get_message
y get_other_message
funciones podrían ser muchas líneas de código y son básicamente irrelevante (se puede asumir que el estado del programa después de cada ruta es el mismo); el objetivo aquí es hacer que message
esté listo para usar más allá de esta sección de la función.
he visto el último constructo utilizado varias veces en otras preguntas, tales como:
que construyen sería más aceptable?
que no dependen por completo si desea 'get_message' para ejecutar condicional o incondicional? – delnan
La idea aquí no es la función de llamar, sino la construcción de 'mensaje': la función en sí misma es irrelevante. –
Tanto si se trata de una función como si no, la única diferencia semántica es que se ejecuta la mitad del código incondicionalmente. Si hace una diferencia, no tiene mucho sentido debatir el estilo. – delnan