Desembalaje estrella para clases propias.

Me preguntaba si es posible usar el desempaquetado de estrellas con clases propias en lugar de solo las integradas como list y tuple .

 class Agent(object): def __init__(self, cards): self.cards = cards def __len__(self): return len(self.cards) def __iter__(self): return self.cards 

Y poder escribir

 agent = Agent([1,2,3,4]) myfunc(*agent) 

Pero me sale:

 TypeError: visualize() argument after * must be a sequence, not Agent 

¿Qué métodos debo implementar para poder desempacar?

El mensaje de excepción:

argumento después de * debe ser una secuencia

realmente debería decir, argument after * must be an iterable .

A menudo, el desempaquetado de estrellas se denomina “desempaquetado iterable” por este motivo. Consulte PEP 448 (Generalizaciones de desempaque adicionales) y PEP 3132 (Desempaquetado iterable extendido) .

Edición: Parece que esto se ha corregido para Python 3.5.2 y 3.6 . En el futuro dirá:

argumento después de * debe ser un iterable


Para poder desempaquetar en estrella, su clase debe ser iterable, es decir, debe definir un __iter__ que devuelva un iterador:

 class Agent(object): def __init__(self, cards): self.cards = cards def __len__(self): return len(self.cards) def __iter__(self): return (card for card in self.cards) 

entonces:

 In [11]: a = Agent([1, 2, 3, 4]) In [12]: print(*a) # Note: in python 2 this will print the tuple 1 2 3 4