2012-07-30 9 views
5

Quiero cambiar una función python para devolver dos valores. ¿Cómo lo logro sin afectar ninguna de las llamadas a función previas que solo esperan un valor de retorno?Valores devueltos múltiples en python

Por ej.

definición original:

def foo(): 
    x = 2 
    y = 2 
    return (x+y) 

suma = foo()

Ne Definición:

def foo(): 
    x = 2 
    y = 2 
    return (x+y), (x-y) 

suma, diff = foo()

quiero hacer esto en una forma en que la llamada anterior a foo también sigue siendo válida? ¿Esto es posible?

Respuesta

12
def foo(return_2nd=False): 

    x = 2 
    y = 2 
    return (x+y) if not return_2nd else (x+y),(x-y) 

luego llamar a una nueva versión

sum, diff = foo(True) 
sum = foo() #old calls still just get sum 
+1

Buen truco. Si quisieras utilizar todo Java en las cosas aquí, ¿no podrías cambiarlo para devolver una clase personalizada que actúa como int (el primer valor normalmente), pero que también podría indexarse ​​como una tupla? Entonces ni siquiera necesita cambiar la firma de la llamada. –

+0

podrías pero eso sería más trabajo, creo ... esta fue la manera más simple (me pareció) para lograr lo que el OP quería ... –

+0

Por cierto, ¿estás relacionado con el famoso [David Beasley] (http: //www.dabeaz.com/)? –

0

Lamento decírtelo, pero la sobrecarga de funciones no es válida en Python. Debido a que Python no hace type-enforcement, múltiples definiciones de resultados foo en el último válido que se utiliza. Una solución común es definir múltiples funciones, o para añadir un parámetro en la función como una bandera (que tendría que aplicar a sí mismo)

2

Al cambiar la tipo de valor de retorno está cambiando el "contrato" entre esta función y cualquier código que la llame. Entonces probablemente deba cambiar el código que lo llama.

Sin embargo, podría agregar un argumento opcional que cuando se establezca devolverá el nuevo tipo. Tal cambio preservaría el contrato anterior y le permitirá tener uno nuevo también. Aunque es extraño tener diferentes tipos de tipos de devolución. En ese punto, probablemente sería más limpio crear una nueva función por completo, o arreglar el código de llamada también.

Cuestiones relacionadas