2012-05-29 12 views
24

Como se ha mencionado here, puede utilizar la estrella para desempaquetar un número desconocido de variables (como en funciones), pero sólo en Python 3:Python estrellas desembalaje para la versión 2.7

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

en Python 2.7, el mejor yo puedo llegar a es (no es terrible, pero molesto):

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

¿hay una manera de importar esto desde __future__ división similar, o necesitaré mi propia función para hacer desconocidas de longitud desembalaje en Python 2.7?

+4

No. Esa es una de las pocas Py3k * solo * características. – JBernardo

+1

Se llama desempaquetado extendido –

Respuesta

25

en Python 2.x, que puede hacer:

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

, siempre y cuando c tiene al menos un miembro que va a funcionar porque si c Sólo hay 1 cosa en ella es c[1:][].

Probablemente debería asegurarse de que haya al menos una cosa en c, o bien c[0] generará una excepción.

Se podría hacer algo como:

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 si 'c' es una secuencia. El desempaquetado funciona con cualquier iterable, por lo que para una solución completa, haga 'c = tuple (c)' primero. Esto emula el comportamiento exactamente, incluso colgando en iterables infinitos. Pero aún tienes que trabajar más duro para 'a, * b, c = range (10)'; pero no hay manera de evitarlo. – lvc

+0

@lvc buen punto. He editado mi respuesta. – Andbdrew

+2

@lvc man, eso 'a, * b, c = range (10)' es muy bueno! – Andbdrew

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

es también una opción para manejar el caso donde c es una secuencia vacía, aunque no distinguirá entre [Ninguno] y [] en términos como asignaciones a a, b. Así que úsalo con cuidado, el try/except es probablemente el mejor.

No puedo ver la diferencia real entre Python 3 y 2.7 al manejar un contenedor vacío, pero lo bueno de Python 3 es que funciona con cualquier iterable.

Esto funciona en 2.7 si sabes que c es un generador.

a,b = c.next(), c 

Pero la belleza de desembalaje parece requerir Python 3.