Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Closed
Description
Bug report
Between Python 3.12 alpha 7 and beta 1 the behaviour of format specifiers containing a backslash (e.g.\n
,\u2603
) in f-strings changed.
Previously, the__format__
method would get e.g. the newline character, but it now receives a backslash and ann
character (i.e. the string"\n"
)
The following script demonstrates this:
# issue.pyclassF:def__format__(self,format_spec):print("spec:",repr(format_spec))returnformat_spec.join(["a","b","c"])print("out: ",repr((f"{F():\n}")))print("out: ",repr((f"{F():\u2603}")))print("out: ",repr((format(F(),"\n"))))print("out: ",repr((format(F(),"\u2603"))))
$python3.11 issue.pyspec: '\n'out: 'a\nb\nc'spec: '☃'out: 'a☃b☃c'spec: '\n'out: 'a\nb\nc'spec: '☃'out: 'a☃b☃c'
$python3.12 issue.pyspec: '\\n'out: 'a\\nb\\nc'spec: '\\u2603'out: 'a\\u2603b\\u2603c'spec: '\n'out: 'a\nb\nc'spec: '☃'out: 'a☃b☃c'
In both cases theformat()
function works correctly - I only encounter the issue with f-strings.
I suspect this is related to the PEP 701 changes to f-strings, but I couldn't find anything in the discussion of that PEP to suggest this was a deliberate change.
Your environment
- CPython versions tested on: Python 3.11.2, 3.12.0alpha7, 3.12.0beta1
- Operating system and architecture: Ubuntu 20.04 (AMD64)