[Python-ideas] Briefer string format
Eric V. Smith
eric at trueblade.com
Sat Aug 1 20:51:09 CEST 2015
On 8/1/2015 2:25 PM, Steven D'Aprano wrote:
> On Sat, Aug 01, 2015 at 01:43:49PM -0400, Eric V. Smith wrote:
>> With str.format, !s and !r are needed because you can't put the call to
>> repr in str.format's very limited expression syntax. But since f-strings
>> support arbitrary expressions, it's not needed.
>
> Wait, did I miss something? Does this mean that f-strings will
> essentially be syntactic sugar for str(eval(s))?
>
> f"[i**2 for i in sequence]"
>
> f = lambda s: str(eval(s))
> f("[i**2 for i in sequence]")
Well, it's somewhat more complex.
It's true that:
>>> sequence=[1,2,3]
>>> f"{[i**2 for i in sequence]}"
'[1, 4, 9]'
But it's more complex when there are format specifiers and literals
involved.
Basically, the idea is that:
f'a{expr1:spec1}b{expr2:spec2}c'
is shorthand for:
''.join(['a', expr1.__format__(spec1), 'b',
expr2.__format__(spec2), 'c'])
The expressions can indeed be arbitrarily complex expressions. Because
only string literals are supported, it just the same as if you'd written
the expressions not inside of a string (as shown above). It's not like
you're eval-ing user supplied strings.
Eric.
More information about the Python-ideas
mailing list