Qual è il modo migliore per restituire più valori da una funzione in Python?
Domanda
Ho una funzione in cui devo fare qualcosa su una stringa.Ho bisogno che la funzione restituisca un valore booleano che indichi se l'operazione è riuscita o meno e devo anche restituire la stringa modificata.
In C#, utilizzerei un parametro out per la stringa, ma non esiste un equivalente in Python.Sono ancora molto nuovo in Python e l'unica cosa che mi viene in mente è restituire una tupla con la stringa booleana e modificata.
Domanda correlata: È Pythonic che una funzione restituisca più valori?
Soluzione
def f(in_str):
out_str = in_str.upper()
return True, out_str # Creates tuple automatically
succeeded, b = f("a") # Automatic tuple unpacking
Altri suggerimenti
Perché non lanciare un'eccezione se l'operazione non ha avuto successo?Personalmente, tendo a essere dell'opinione che se è necessario restituire più di un valore da una funzione, è necessario riconsiderare se si sta facendo le cose nel modo giusto o si utilizza un oggetto.
Ma più direttamente al punto, se lanci un'eccezione, li costringi ad affrontare il problema.Se provi a restituire un valore che indica un errore, è molto probabile che qualcuno non riesca a controllare il valore e si ritrovi con alcuni errori potenzialmente difficili da eseguire il debug.
Restituisce una tupla.
def f(x):
# do stuff
return (True, modified_string)
success, modified_string = f(something)
Restituire una tupla è il modo usuale per farlo in Python.
Lanciare un'eccezione in caso di errore è un buon modo di procedere e, se restituisci molti valori diversi, puoi restituire una tupla.Per il caso specifico che stai citando, spesso seguo un approccio intermedio:restituisce la stringa modificata in caso di successo e restituisce None in caso di fallimento.Sono abbastanza programmatore C non ricostruito da voler restituire un puntatore NULL al carattere in caso di errore.
Se stessi scrivendo una routine da utilizzare come parte di una libreria più grande e utilizzata da altri sviluppatori, genererei un'eccezione in caso di fallimento.Quando mangio il mio cibo per cani, probabilmente restituirò tipi diversi e li testerò al ritorno.