0. I believe that the `dict` behavior needs to be frozen. The change will break 
a lot of existing code, it's too much damage.
0.1. Yes, `keys` is not a good name for internal use, but that's okay.
0.2. If I want to make a class look like a `dict`, I understand that I will get 
`keys`, `items`... This is what I expect.
0.3. When I work with dicts in my code, I have a choice, I can use the default 
`dict`, or I can create my own dict-like class and implement different behavior.
0.4. `other[k] for k in other.keys()` default behaviour in `dict.update(other: 
Dict)` is a different big question about the degree of damage. Basically I can 
use `dict.update(dict.items())`.

Back to the stars:

1. `*`, `**` are operators, but behaviorally they are methods or functions. I 
think this is the main problem.
1.1. Python operators (mostly?) use their dunder methods to control their 
behavior.
1.2. Unpack operators are nailed to specific objects and their behavior, like 
an function or method. As a result, we lose control over them.

2. `*` nailed to `Iterable`, not so bad.
2.1. It uses the `__iter__` method. I can implement any behaviour.
2.2. I only see one problem. I can't realize any other behavior for iterating 
and unpacking inside a custom class.
2.3. A new special method for unpacking is a better idea. By default, this 
method should return `self.__iter__`. This will give control and not break 
existing code.

3. `**` nailed to `dict`. I think this is the fundamental problem.
3.1. `dict` is a good choice for the DEFAULT `kwargs` container. But `dict` is 
too excess for `**`. One method that returns an iterator is enough.
3.2. `**` use a `kwargs[k] for k in kwargs.keys()` like implementation. I have 
no control over this behavior.
3.3. I am forced to implement excessive functionality.
3.4. I must take userspace named `keys()`.
3.5. I cannot implement `keys` and `__getitem__` independent unpacking inside 
the class.

4. Which I think we can do.
4.1. Make `*` and `**` operators with their own methods.
4.2. Implement `return self .__ iter __ ()` as the default behavior of `*`.
4.3. Create a new implementation of the `**` operator expecting: `Iterator 
[Tuple [key, val]]`.
4.4. Implement `return ((k, self[k]) for k in self.keys())` as the specific 
behaviour of `dict`.
4.5. Create a `collections.abc` layout with an abstract two star unpacking 
method.
4.6. Update PEP 448.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/XTNNF2ZW52KCT4MJW5POJWZLIXXZZJ4G/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to