New submission from Tim Hatch <t...@timhatch.com>:

TL;DR

f"{x+2}" and f"{x=}" do something sensible.
"{x+2}".format(x=1) and "{x=}".format(x=1) raise KeyError.
f"{0.1}" and "{0.1}".format(...) are different.

Having had a feature request to be able to codemod f-strings[1] and just 
learning about issue36817[2] last night, I went digging into how these are 
parsed in the standard library to be able to reuse that.

str.format, string.Formatter, and the _string module can only parse literal 
keys, not expressions, despite appearing to take the same syntax as f-strings.  
I'm happy to contribute code to change this, but unsure if it's considered a 
bug or feature (now that we're past feature freeze for 3.8).  I would love to 
see these converge to prevent confusion and let us document in just one place.

The {} and {1} style are still exceptional.

We already parse expressions and the "=" suffix acceptably,

>>> list(_string.formatter_parser("{1+1}"))
[('', '1+1', '', None)]
>>> list(_string.formatter_parser("{(x)}"))
[('', '(x)', '', None)]
>>> list(_string.formatter_parser("{x=!r:1}"))
[('', 'x=', '1', 'r')]
>>> list(_string.formatter_parser("{ x = }"))
[('', ' x = ', '', None)]

But the consumers would need to check for /=\s*$/ and call eval on the items in 
formatter_field_name_split.  (I lack a good heuristic, maybe we eval every time 
unless it's strictly numeric?)

It would also break unusual uses like these in the name of unification

>>> "{1+1}".format(**{"1+1": "zzz"})
'zzz'

and

>>> class T:
...   pass
... 
>>> setattr(T, "0", "zero")
>>> f"{T.0}"
  File "<fstring>", line 1
    (T.0)
       ^
SyntaxError: invalid syntax
>>> "{0.0}".format(T)
'zero'

[1] https://github.com/facebookincubator/Bowler/issues/87
[2] incorrectly listed in Misc/NEWS.d/3.8.0b1.rst as issue36774 btw

----------
components: Library (Lib)
messages: 346065
nosy: barry, eric.smith, larry, lisroach, lukasz.langa, serhiy.storchaka, thatch
priority: normal
severity: normal
status: open
title: str.format and f-string divergence
type: enhancement
versions: Python 3.8, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue37341>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to