python iterable-unpacking

Python star desempaquetando para la versión 2.7



iterable-unpacking (2)

Como se mencionó here , puede usar la estrella para descomprimir un número desconocido de variables (como en las funciones), pero solo en Python 3:

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

En Python 2.7, lo mejor que puedo encontrar es (no terrible, pero molesto):

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

¿Hay alguna forma de importar esto desde __future__ como división, o necesitaré mi propia función para realizar el desempaquetado de longitud desconocida en Python 2.7?


En Python 2.X, puedes hacer:

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

siempre que c tenga al menos un miembro, funcionará porque si c solo tiene 1 cosa c[1:] es [] .

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

Podrías 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


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

También es 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, b. Por lo tanto, úselo con cuidado, el try / except es probablemente el mejor.

No puedo ver una diferencia real entre Python 3 y 2.7 cuando se maneja 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 desempacar parece requerir Python 3.