On Fri, Oct 23, 2020 at 11:10 AM Steven D'Aprano <st...@pearwood.info>
wrote:

> > but that doesn't make it make sense to write `... = **values` as you
> > suggest.
>
> Iterator unpacking on a dict already works:
>
>     py> d = {'a': 10, 'b': 20}
>     py> spam, eggs = d
>     py> spam, eggs
>     ('a', 'b')
>
> so we need to distinguish the iterator unpacking case from the dict
> unpacking case.


I understand that, I just don't think this particular method of
distinguishing is sufficiently justified.

(Heretical question: do we *really* need to distinguish it in syntax?
Iterator unpacking a dict seems like a dumb idea, I wouldn't be sad if we
broke compatibility there)

To me it makes sense to use the same double star used in
> dict unpacking inside dict displays and function calls.
>

It makes some sense, but overall it's still quite different to anything
existing. Typically the mechanics of assignment are defined by symbols that
come before the =. This applies to iterable unpacking, setting attributes
and mapping items, and augmented assignment. Everything after = just a
normal expression.

The most obvious syntax is to just assign to a dict display:

    {'spam': spam, 'eggs': eggs, **kw} = kwargs  # not **kwargs

The meaning seems intuitive and obvious at a glance. And it's flexible if
the variable names don't always match the keys. But it's verbose and
repetitive in the common case where the names match.

I think it would be great if we had a syntax for abbreviating normal dicts
with 'same name' keys. We discussed a lot of options earlier this year, e.g:

    {**, spam, eggs}
    {:spam, :eggs}
    {{spam, eggs}}

Then using the same syntax in both dict unpacking and dict displays as
expressions would be intuitive and obvious. This would be valid, although
redundant:

    {**, spam, eggs} = {**, spam, eggs}

and it would still be easy to add cases where names don't match:

    {'sleep': duration, **, spam, eggs} = kwargs

Also, unpacking nested dicts follows naturally, whether we have an
abbreviated syntax or not:

    {'spam': {'eggs': eggs, 'foo': foo}, 'bar': bar} = {'spam': {'eggs':
eggs, 'foo': foo}, 'bar': bar}

As does unpacking in a loop:

    for {**, spam, eggs} in list_of_dicts:

whereas I'm not sure what would be done in your proposal. Something like
this?

    for spam, eggs in **list_of_dicts:
_______________________________________________
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/SNYIR4IUSTYYH6IQNMCQ5SUTORDPILO6/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to