On Sun, Dec 27, 2020 at 01:34:02PM +1300, Greg Ewing wrote:
> On 27/12/20 10:15 am, Christopher Barker wrote:
> >It does seem like ** could be usable with any iterable that returns 
> >pairs of objects. However the trick is that when you iterate a dict, you 
> >get the keys, not the items, which makes me think that the only thing 
> >you should *need* is an items() method that returns an iterable (pf 
> >pairs of objects).
> 
> It seems to me it would be more fundamental to use iteration to get
> the keys and indexing to get the corresponding values. You're only
> relying on dunder methods then.

I think if we were designing mapping protocols now, that would be an 
excellent idea, but we aren't, we have decades of history from `dict` 
behind us. And protocols from dict use `keys()` and getitem. E.g. 
update.

I think it would be confusing to have dict protocols use keys and double 
star use items, so I think it would be better to follow the API of 
dict.update:

    D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
    If E is present and has a .keys() method, then does:  for k in E: D[k] = 
E[k]
    If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] 
= v

So to have an object E usable with double star dict unpacking, perhaps 
it needs to either:

* have a keys() method which iterates over keys (assumed to all be 
  strings), and `__getitem__`; or

* support iteration, yielding (key, value) pairs.


-- 
Steve
_______________________________________________
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/5VXR3ZDKGF6BQDEGQXELSEKIDVVLPLGG/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to