2008-09-01 13 views
57

Tengo una función en la que necesito hacer algo con una cuerda. Necesito la función para devolver un booleano que indique si la operación tuvo éxito o no, y también necesito devolver la cadena modificada.¿Cuál es la mejor manera de devolver múltiples valores de una función en Python?

En C#, utilizaría un parámetro de salida para la cadena, pero no hay 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: Is it pythonic for a function to return multiple values?

+0

He agregado un enlace a la pregunta relacionada – jfs

Respuesta

116
def f(in_str): 
    out_str = in_str.upper() 
    return True, out_str # Creates tuple automatically 

succeeded, b = f("a") # Automatic tuple unpacking 
+1

Me gustaría agregar que el presente enfoque funciona con matrices y matrices también – Nicholas

7

Devolución de una tupla es la forma habitual de hacer esto en Python.

15

Devuelve una tupla.

def f(x): 
    # do stuff 
    return (True, modified_string) 

success, modified_string = f(something) 
+0

Mi socio discuta conmigo sobre el clima debe agregar '(' y ')' cuando quiera devolver valores múltiples. Cuando escribo código en Pycharm, el ide muestra el desgaste en las líneas donde devuelve valores múltiples con '()', pero no podemos encontrar la regla de estilo de código en pep8. ¿Cómo piensas sobre ello? Gracias. –

28

Por qué no lanzar una excepción si la operación no se ha realizado correctamente? Personalmente, tiendo a opinar que si necesita devolver más de un valor de una función, debería reconsiderar si está haciendo las cosas correctamente o si usa un objeto.

Pero más directamente al punto, si lanza una excepción, los está forzando a resolver el problema. Si intentas devolver un valor que indique falla, es muy posible que alguien no pueda verificar el valor y terminar con algunos errores potencialmente difíciles de depurar.

+1

de acuerdo. Las funciones Pythonic no deben devolver códigos para indicar "éxito/fracaso" cuando uno es mucho más probable que el otro. Solo lanza una excepción en el caso excepcional. Dicho esto, simplemente devuelva una tupla cuando sea necesario: "return a, b, c" –

+5

No me gustan las funciones que generan excepciones para los errores no fatales. –

+3

Cuando la falla es común, devolver la información de falla en una tupla es un buen enfoque. Ejemplo sería una función a la que llamas varias veces con valores de prueba para encontrar un valor "bueno", esperas que falle muchas veces y, finalmente, encuentres un buen valor. En ese caso simplemente "devuelve el resultado, la razón" en lugar de presentar una excepción. – Graham

3

Lanzar una excepción por falla es una buena manera de proceder, y si devuelve una gran cantidad de valores diferentes, puede devolver una tupla. Para el caso específico que está citando, a menudo tomo un enfoque intermedio: devolver la cadena modificada en caso de éxito y devolver None en caso de error. Soy un programador de C no reconstruido suficiente como para querer devolver un puntero NULL a la falla de char.

Si estuviera escribiendo una rutina para ser utilizada como parte de una biblioteca más grande y consumida por otros desarrolladores, lanzaría una excepción en caso de error. Cuando me coma mi propia comida para perros, probablemente regrese tipos diferentes y la prueba a la vuelta.

Cuestiones relacionadas