What if the mapping assignment were more harmonious with the pattern matching
PEP? Something like this:
items = {'eggs': 2, 'cheese': 3, 'spam': 1}
{'eggs': eggs, 'spam': i_dont_need_to_name_this_spam, **rest} = items
assert i_dont_need_to_name_this_spam == 1
assert eggs == 2 and cheese == 3
assert rest == {'cheese': 3}
The keys here could be arbitrary hashables and the "values" could be arbitrary
assignment targets (assigned all-or-nothing). This wouldn't need the
right-hand-side double-star, and I think it more closely resembles the sequence
unpacking assignment syntax. You can assign to a (thing that looks like a)
tuple or to a (thing that looks like a) list or to a sequence subscript or
object attribute, why not be able to assign to a (thing that looks like a)
dictionary? This also avoids polluting the local namespace in case one of your
keys is the string "range" or something. It also feels less magical to me,
albeit more verbose.
Calls to a hypothetical parse/sscanf function could closely mirror some
str.format() calls:
text = "{a}, {b}, {c}".format(**{'a': a0, 'b': b0, 'c': c0})
{'a': a1, 'b': b1, 'c': c1} = "{a}, {b}, {c}".parse(text)
assert (a1, b1, c1) == (a0, b0, c0)
Alternative positional parsing would be useful as well, as in:
text = "{}, {}, {}".format(a0, b0, c0)
a1, b1, c1 = "{}, {}, {}".parse(text)
assert (a1, b1, c1) == (a0, b0, c0)
This way, pattern.format() and pattern.parse() would be trying to be inverses
of each other (as much as is reasonable, probably limited to parsing strings,
floats and ints).
Then maybe people could get used to a format-string-like mini-language for
parsing, and eventually, the f-string assignment might be better received, and
we could propose something like
text = f"{a0}, {b0}, {c0}"
f"{a1}, {b1}, {c1}" = text
assert (a1, b1, c1) == (a0, b0, c0)
as well, where we lose some of the flexibility but gain better D.R.Y. and more
visual locality, useful in the simple cases. I see the potential for a strong
analogy:
positional format() : keyword-based format() : fstrings
::
positional parse() : keyword-based parse(): assignment to fstrings
_______________________________________________
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/H5252OAGH2IWEVQ26F2OWNQZCGMVNZWP/
Code of Conduct: http://python.org/psf/codeofconduct/