2012-05-29 17 views
24

Come accennato here, è possibile utilizzare la stella per l'estrazione, un numero imprecisato di variabili (come in funzioni), ma solo in Python 3:Python stelle disimballaggio per la versione 2.7

>>> a, *b = (1, 2, 3) 
>>> b 
[2, 3] 
>>> a, *b = (1,) 
>>> b 
[] 

In Python 2.7, il migliore posso venire in mente è (non è terribile, ma fastidioso):

c = (1, 2, 3) 
a, b = c[0], c[1:] if len(c) > 1 else [] 

esiste un modo per importare questo da __future__ divisione simile, o avrò bisogno la mia funzione per fare sconosciuta lunghezza disimballaggio in Python 2.7?

+4

No. Questo è uno dei pochi Py3k * solo * caratteristiche. – JBernardo

+1

Si chiama esteso disimballaggio –

risposta

25

in python 2.X, si può fare:

c = (1, 2, 3) 
a, b = c[0], c[1:] 

finché c ha almeno un membro che funzionerà perché se c ha solo 1 cosa in esso c[1:] è [].

Probabilmente dovresti assicurarti che ci sia almeno una cosa in c, oppure c[0] solleverà un'eccezione.

Si potrebbe fare qualcosa di simile:

try: 
    c = tuple(c) 
    a, b = c[0], c[1:] 
except TypeError, IndexError: 
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it. 
    # do something else 
    pass 
+3

Solo se 'C' è una sequenza. Apertura della confezione lavori con qualsiasi iterabile, quindi per una soluzione completa, fare 'c = tuple (c)' prima. Questo emula esattamente il comportamento, incluso aggrapparsi a infiniti iterables. Ma devi ancora lavorare di più per 'a, * b, c = range (10)'; ma non c'è un modo reale intorno a ciò. – lvc

+0

@lvc buon punto. Ho modificato la mia risposta. – Andbdrew

+2

uomo @lvc, che 'a, * b, c = gamma (10)' è abbastanza freddo! – Andbdrew

2
(a,b) = (None, []) if not len(c) else (c[0], c[1:]) 

è anche un'opzione per la gestione del caso in cui c è una sequenza vuota, anche se non sarà distinguere tra [Nessuno] e [] in termini come incarichi a a, b. Quindi usatelo con cura, il try/except è probabilmente il migliore.

vedo alcuna reale differenza tra Python 3 e 2,7 durante la manipolazione di un contenitore vuoto, ma la cosa bella di Python 3 qui è che funziona con qualsiasi iterabile.

Questo funziona in 2,7 se si sa c è un generatore.

a,b = c.next(), c 

Ma tutta la bellezza di disimballaggio sembra richiedere Python 3.