2016-05-23 17 views
5

Mi stavo chiedendo se è possibile utilizzare Star decompressione con le proprie classi anziché solo builtin come list e tuple.star disimballaggio per le proprie classi

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

Ed essere in grado di scrivere

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

ma ottengo:

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

Quali metodi devo implementare al fine di rendere il disimballaggio possibile?

+6

Il tuo '__iter__' dovrebbe restituire un iteratore sulle tue carte, non la loro lunghezza. – kindall

+1

Possibile duplicato di [Come rendere la classe iterabile?] (Http://stackoverflow.com/questions/19151/how-to-make-class-iterable) –

+1

@Rogalski Non sono d'accordo questo è un duplicato, non è ovvio che renderlo iterable risolve il problema della scomparsa delle stelle (anche se lo fa). –

risposta

6

Il messaggio di eccezione:

argomento dopo * deve essere una sequenza

dovrebbe davvero dire, argument after * must be an iterable.

Spesso il disimballaggio a stella viene chiamato "disimballaggio iterabile" per questo motivo. Vedere PEP 448 (Additional Unpacking Generalizations) e PEP 3132 (Extended Iterable Unpacking).

Modifica: Sembra che questo sia stato fixed for python 3.5.2 and 3.6. In futuro dirà:

argomento dopo * deve essere un iterabile


Per avere stelle scompattare, la classe deve essere un iterabile cioè deve definire un __iter__ che restituisce un iteratore:

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) 

poi:

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 
+0

Questo bug è stato corretto a gennaio! https://github.com/python/cpython/blob/1123d9a07b4ab916e4d800308053980bcf8dbd57/Python/ceval.c#L5038-L5039 –

Problemi correlati