[Python-ideas] Unpacking a dict

Michael Selik michael.selik at gmail.com
Wed May 25 20:29:09 EDT 2016


On Wed, May 25, 2016 at 7:41 PM Ethan Furman <ethan at stoneleaf.us> wrote:

>    a, b = mapping
>    a, b, **_ = mapping  # when you don't care about the rest
>

I'd grudgingly accept this as a second-best syntax. It doesn't support keys
that aren't strs of valid identifiers, but I suppose ``def foo(**kwargs)``
doesn't either. I frequently have keys that are strs with punctuation, keys
that are tuples of ints, etc. Being restricted to identifiers feels cramped.

Also, I wonder if the implementation will be more difficult. In tuple
unpacking, it's the LHS that provides the semantic meaning. The RHS is just
duck-typed. What's the appropriate error message if you meant to do dict
unpacking and didn't have a mapping on the RHS?

    py> a, b = 42
    TypeError: 'int' object is not iterable
    py> {'a': x, 'b': y} = 42
    TypeError: 'int' object is not subscriptable


I think that most Pythonistas would say:
>    a, b = 1, 2  # look ma!  no round brackets!
>

You need brackets for nested/recursive destructuring.

    py> a, b, (c, d) = 1, 2, (3, 4)
    py> {'a': x, 'b': {'c': y, 'd': z} = {'a': 1, 'b': {'c': 2, 'd': 3}}


matching syntax is out-of-scope for an
> unpacking proposal.  At most, it should be a "let's not paint ourselves
> into a corner" type of concern -- and I must admit I don't see why
>    a, b, c = some_dict
> rules out
>   {'x': a, 'y':b} = some_dict
> as a pattern-matching construct.
>

Yep. I just want to look ahead a bit. While you're considering dict
unpacking syntax options, keep in mind that tuple matching will need to
parallel dict matching. Also, our future selves will want one-way-to-do-it
when considering matching syntaxes.

    py> a, b, c, 0 = 1, 2, 3, 4
    ValueError: index 3 does not match value 0
    py> {'x': a, 'y': 0} = {'x': 1, 'y': 2}
    ValueError: key 'y' does not match value 0



> On Wed, May 25, 2016 at 11:18 AM Paul Moore wrote:
> >> get a set of elements and *ignore* the rest:
>
> Since you've repeated yourself, I will too.  ;)
>

I figured repetition was more clear than "see above". :-)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160526/ff992f81/attachment-0001.html>


More information about the Python-ideas mailing list