[Python-ideas] f-string, for dictionaries
Paul Moore
p.f.moore at gmail.com
Tue Oct 25 16:27:58 EDT 2016
On 25 October 2016 at 20:11, Michel Desmoulin <desmoulinmichel at gmail.com> wrote:
> Similarly, I'd like to suggest a similar feature for building dictionaries:
>
>>>> foo = 1
>>>> bar = 2
>>>> {:bar, :foo}
> {'bar': 1, 'foo', 2}
I don't see a huge advantage over
>>> dict(foo=foo, bar=bar)
Avoiding having to repeat the variable names doesn't feel like a
killer advantage here, certainly not sufficient to warrant adding yet
another dictionary construction syntax. Do you have examples of code
that would be substantially improved with this syntax (over using an
existing approach)?
> And a similar way to get the content from the dictionary into variables:
>
>>>> values = {'bar': 1, 'foo', 2}
>>>> {:bar, :foo} = values
>>>> bar
> 1
>>>> foo
> 2
There aren't as many obvious alternative approaches here, but it's not
clear why you'd want to do this. So in this case, I'd want to see
real-life use cases. Most of the ones I can think of are just to allow
a shorter form for values['foo']. For those uses
>>> from types import SimpleNamespace
>>> o = SimpleNamespace(**values)
>> o.foo
1
works pretty well.
> The syntaxes used here are of course just to illustrate the concept and I'm
> suggesting we must use those.
Well, if we ignore the syntax for a second, what is your proposal
exactly? It seems to be in 2 parts:
1. "We should have a dictionary building feature that uses keys based
on variables from the local namespace". OK, that's not something I've
needed much, and when I have, there have usually been existing ways to
do the job (such as dict(foo=foo) noted above) that are perfectly
sufficient. Sometimes the existing alternatives look a little clumsy
and repetitive, but that's a very subjective judgement, and any new
syntax could easily look worse to me (your specific proposal, for
example, does). So I can see a small potential benefit in (subjective)
readability, but that's offset by the proposal being another way of
doing something that's already pretty well covered in the language.
Add to that all of the "normal" objections to new syntax (more to
teach/learn, hard to google, difficulty finding a form that suits
everyone, etc) and it's hard to see this getting accepted.
2. "We should have a way of unpacking a dictionary into local
variables". That's not something that I can immediately think of a way
of doing currently - so that's a point in its favour. But honestly,
I've never seen the need to do this outside of interactive use (for
which see below). If all you want is to avoid the d['name'] syntax,
which is quite punctuation-heavy, the SimpleNamespace trick above does
that. So there's almost no use case that I can see for this. Can you
give examples of real-world code where this would be useful?
On the other hand, your proposal, like many that have come up
recently, seems to be driven (if it's OK for me to guess at your
motivations) by an interest in being able to write relatively terse
one-liners, or at least to avoid some of the syntactic overheads of
existing constructs. It seems to me that the environment I'd most want
to do this in is the interactive interpreter. So I wonder if this (and
similar) proposals are driven by a feeling that it's "clumsy" writing
code at the interactive prompt. That may well be so. The standard
interactive prompt is pretty basic, and yet it's a *huge* part of the
unique experience working with Python to be able to work at the prompt
as you develop. So maybe there's scope for discussion here on
constructs focused more on interactive use? That probably warrants a
separate thread, though, so I'll split it off from this discussion.
Feel free to contribute there if I'm right in where I think the
motivation for your proposals came from.
Paul
More information about the Python-ideas
mailing list