Buone pratiche per i ritorni in Python

4

Di recente stavo lavorando su un codice prototipo in Python. Il codice funzionava alla grande, poi mi sono reso conto che avevo bisogno di un po 'più di feedback da una delle mie funzioni, quindi ho cambiato la dichiarazione di ritorno da

return x

a

return (x,y)

Quindi, tornando al codice refactoring esistente, mi sono reso conto che, a meno che non cerco invocazione di questa funzione su tutto il codice base, non conoscerò alcun problema fino al momento dell'esecuzione (e se questo è un caso marginale) a malapena e rischiando il crash del programma a causa di un'eccezione non rilevata con conseguente operazioni su tipi non corrispondenti. Lo contrasto con i linguaggi tipizzati in modo statico, dove al momento della compilazione mi viene detto di tutte le posizioni in cui il ritorno non combina il tipo previsto.

Quindi mi chiedevo se esistesse qualche saggezza convenzionale associata ai tipi di ritorno in Python per evitare di sottrarre questo senso al codice.

P.S > Ovviamente i migliori schemi di progettazione risolverebbero questo problema o non userebbero il linguaggio digitato anatra, ma a volte si incontra un caso quando si cambia il tipo di ritorno.

    
posta Alex 29.07.2014 - 17:05
fonte

2 risposte

2

PyCharm (la versione community è FOSS) farà un buon lavoro nel trovare tutte le chiamate alla tua funzione ( Alt - F7 ), così puoi facilmente vedere come è chiamato. Ovviamente, essendo un linguaggio dinamico, non è in grado di districare codice veramente orribile, ma il tuo caso d'uso dovrebbe andare bene.

Un altro meccanismo che può adattarsi meglio al tuo caso (poiché restituire due cose è un modo comune per il codice di annusare gli oggetti mancanti) è quello di restituire un oggetto con due attributi.

    
risposta data 29.07.2014 - 17:45
fonte
0

Oltre a ciò che dicono le altre 2 risposte (strumento di refactoring / suite di test / restituire un oggetto che si comporta come il tuo valore di ritorno originale), un correttore di tipo statico come mypy lo prenderebbe immediatamente, perché stai cambiando il tipo di la funzione.

Un esempio molto semplificato:

def foo() -> Tuple[int, str]:
    original_return_value = 23
    return original_return_value, "additional information"

a = foo() / 3  # type error: Tuple can't be divided by int

Ovviamente, questo non ti aiuterà molto con una base di codice esistente.

    
risposta data 04.10.2018 - 18:34
fonte

Leggi altre domande sui tag