¿Cuál es la mejor manera de devolver múltiples valores de una función en Python?

StackOverflow https://stackoverflow.com/questions/38508

  •  09-06-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top