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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/5VXR3ZDKGF6BQDEGQXELSEKIDVVLPLGG/
Code of Conduct: http://python.org/psf/codeofconduct/