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.