On Mon, Dec 28, 2020 at 09:06:40AM -0000, Anton Abrosimov 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() 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:
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.