¿Cuál es la mejor manera de devolver múltiples valores de una función en Python?
Pregunta
Tengo una función en la que necesito hacer algo con una cadena.Necesito que la función devuelva un valor booleano que indique si la operación fue exitosa o no, y también necesito devolver la cadena modificada.
En C#, usaría un parámetro de salida para la cadena, pero no existe un equivalente en Python.Todavía soy muy nuevo en Python y lo único que se me ocurre es devolver una tupla con la cadena booleana y modificada.
Pregunta relacionada: ¿Es pitónico que una función devuelva múltiples valores?
Solución
def f(in_str):
out_str = in_str.upper()
return True, out_str # Creates tuple automatically
succeeded, b = f("a") # Automatic tuple unpacking
Otros consejos
¿Por qué no lanzar una excepción si la operación no fue exitosa?Personalmente, tiendo a ser de la opinión de que si necesitas devolver más de un valor de una función, deberías reconsiderar si estás haciendo las cosas de la manera correcta o si estás usando un objeto.
Pero más directamente al grano, si lanzas una excepción, los estás obligando a solucionar el problema.Si intenta devolver un valor que indica error, es muy posible que alguien no pueda verificar el valor y termine con algunos errores potencialmente difíciles de depurar.
Devuelve una tupla.
def f(x):
# do stuff
return (True, modified_string)
success, modified_string = f(something)
Devolver una tupla es la forma habitual de hacerlo en Python.
Lanzar una excepción por error es una buena forma de proceder, y si devuelve muchos valores diferentes, puede devolver una tupla.Para el caso específico que estás citando, suelo adoptar un enfoque intermedio:Devuelve la cadena modificada en caso de éxito y devuelve Ninguno en caso de error.Soy lo suficientemente programador de C no reconstruido como para querer devolver un puntero NULL a char en caso de falla.
Si estuviera escribiendo una rutina para usarla como parte de una biblioteca más grande y consumirla otros desarrolladores, lanzaría una excepción en caso de falla.Cuando como mi propia comida para perros, probablemente devolveré diferentes tipos y la probaré al regresar.