On Thu, Oct 22, 2020 at 8:22 PM Steven D'Aprano <st...@pearwood.info> wrote:
>
> On Wed, Oct 21, 2020 at 07:17:21PM -0700, Guido van Rossum wrote:
>
> > Hmm, if the above is acceptable, maybe f-strings are still the logical next
> > step, since they bring the format and the target name together again.
>
> That's not the only way to bring the format and target name together.
> Both brace-style and percent-style can do that:
>
>     '{number:d}'
>     '%(number)d'

Maybe, but if it isn't an actual syntactic construct, there's no value
- at best, all you can do is return a dictionary, and there's no
convenient way to assign those to locals.

> f-strings also bring so much more to the table than is needed. For this
> syntax to be sensible, we would have to prohibit so many legal f-strings
> that it seems perverse to continue calling the subset of what's left
> over f-strings.
>
> 1. They don't behave like f-strings: text scanning, not evaluation of
> code. What meaning could we give an f-string target like this?
>
>     f'{len(x)+1}' = string

...... mini-language inspired by format language. I'm really not sure
how many times this has to be said. You don't see C programmers
complaining that sscanf and sprintf don't support the exact same set
of things. They're sufficiently similar that it is incredibly
practical and useful; I think there might be something in the zen of
Python about that...

> 4. Actual f-strings need the prefix to distinguish them from regular
> strings. But as an assignment target, there is no existing meaning to
>
>     'email: {name}@{domain}' = string
>
> so the f prefix has no purpose.
>
> When they have so little in common with f-strings, apart from a spurious
> and unnecessary f-prefix, why are we calling them f-strings?

If you're saying that this would be best done with an "assign to
string literal" syntax, then maybe, but I think the similarity with
RHS f-strings is useful enough to keep the prefix. Additionally, the
fact that both of them have to be syntactic constructs rather than
reusable objects is a useful parallel and a useful reminder.

> Another problem is that using only a literal/display form as a target
> means you can't pre-assemble a pattern and apply it later:
>
>     # Match only the given domain.
>     domain = get_wanted_domain()
>     pattern = 'email: {name}@%s' % domain
>     # ... now what?

Right, and you can't do that with f-strings on the RHS either. The
specific thing you're asking about could easily be implemented as a
feature of the minilanguage itself, but I'm not sure it'd actually be
needed. Building patterns for future parsing is simply not the job of
this feature - use a regex if you need that.

> I guess you could fall back to eval:
>
>     eval('f{!r} = {!r}'.format(pattern, string))
>
> but given that both the pattern and the string to be scanned are likely
> to contain untrusted strings, that's probably not a good idea.
>

Agreed. Don't do that. There are PLENTY of better options than eval.

ChrisA
_______________________________________________
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/RPSFAN64VLCXESPVGFFOT67HLGTNO6HU/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to