2013-05-14 12 views
6

Ho una funzione che o restituisce una tupla o Nessuno. Come può il chiamante gestire questa condizione?Come gestire vuota (nessuno) tupla restituita dalla funzione Python

def nontest(): 
    return None 

x,y = nontest() 

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 
+3

L'opzione migliore, se possibile, è di cambiare la funzione chiamata in modo che restituisca sempre una tupla, possibilmente '(Nessuna, Nessuna)' – Elazar

+0

Cosa vuoi fare se la funzione restituisce 'Nessuno'? Cosa dovrebbe essere x in questo caso? Che cosa dovresti essere in quel caso? Vuoi davvero continuare con il calcolo attuale che usa 'x' e' y'? –

risposta

10

EAFP:

try: 
    x,y = nontest() 
except TypeError: 
    # do the None-thing here or pass 

o senza provare, tranne:

res = nontest() 

if res is None: 
    .... 
else: 
    x, y = res 
+0

che dire di [PEP 3132] (http://www.python.org/dev/peps/pep-3132/)? è rilevante in qualche modo? – Elazar

+0

Non sono sicuro di poter (ancora) supporre che OP significhi Python3.x se taggato Python. – Anthon

+0

Anche per 3.x, non penso sia rilevante qui. Per prima cosa dovresti scrivere 'x, * y = nontest()', quindi se 'y' è vuoto fai la cosa' None', altrimenti fai 'y = y [0]', che penso non sia t pulito come una delle due opzioni. Ma, ancora più importante, 'x, * y = nontest()' fallirà ancora su 'None'; dovresti cambiare 'nontest' a' return 'None,)' invece. A quel punto si potrebbe anche solo restituire None, None e quindi non è necessario estendere la decompressione. – abarnert

5

Se è possibile modificare la funzione stessa, è probabilmente una migliore idea per renderlo sollevare un'eccezione rilevante invece di restituire None per segnalare una condizione di errore. Il chiamante dovrebbe quindi solo try/except.

Se il Nonenon è segnalazione di una condizione di errore, si vorrà ripensare la semantica del tutto.

+2

Oppure, se è perfettamente appropriato non restituire nulla, dovresti probabilmente restituire '(None, None)' o qualche altro valore che è una tupla da 2, invece di 'None'. – abarnert

+0

Inoltre, è 'try' /' except', non 'try' /' catch'. – abarnert

+0

@abarnert: hai ragione, certo. Non ho nemmeno toccato Java in mezzo decennio, ma mi perseguita ancora. – Cairnarvon

6

ne dite:

x,y = nontest() or (None,None) 

Se nontest restituisce una tupla di due voce come dovrebbe, allora x e y vengono assegnati agli elementi della tupla. Altrimenti, xey sono assegnati a nessuno. Il lato negativo di questo è che non è possibile eseguire un codice speciale se il test non viene restituito vuoto (le risposte sopra possono aiutarti se questo è il tuo obiettivo). Il lato positivo è che è pulito e di facile lettura/manutenzione.

Problemi correlati