
Steven D'Aprano wrote:
Steven D'Aprano wrote: You contradict yourself: "I can implement any behaviour" "I can't realize any other behaviour ..." Which is correct? I apologize for my english, I meant that I cannot implement the following behavior inside the class: class MyClass: def __iter__(self): return self.items_for_iteration def __unpack__(self): return self.items_for_unpack
I have to make a separate method and have to rely on the user of the class. Ah, now I understand what you mean: you want iteration and iterator unpacking to do different things: obj = MyClass()
On Mon, Dec 28, 2020 at 09:06:40AM -0000, Anton Abrosimov wrote: list(obj) # iteration # --> returns a b c d print(*obj) # iterator unpacking # --> returns x y z
You can't do that, just like you can't make these different: items = list(obj) # iteration
items = [item for item in obj] # iteration in a comprehension
items = [] for item in obj: # iteration in a for-loop items.append(item)
And that is a good thing because it would be confusing and horrible if iteration over an object was different depending on how you iterate over it. We're not going to invent new dunder methods: def __iter__(self):
def __forloop__(self):
def __comprehension__(self):
so that they can be different, and I don't think we should invent a new dunder method __unpack__ so it can be different from iteration. Iterator unpacking is just a form of iteration.
I agree with that. List unpacking is not a problem for me. The only thought: If `*` is an operator as PEP 448 say then there must be a method for it. The `**` behavior makes me sad.