Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Backslash in f-string format specifier gets escape #105194

Copy link
Copy link
Closed
@domdfcoding

Description

@domdfcoding
Issue body actions

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 an n character (i.e. the string "\n")

The following script demonstrates this:

# issue.py

class F:
	def __format__(self, format_spec):
		print("spec:", repr(format_spec))
		return format_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.py
spec: '\n'
out:  'a\nb\nc'
spec: '☃'
out:  'a☃b☃c'
spec: '\n'
out:  'a\nb\nc'
spec: '☃'
out:  'a☃b☃c'
$ python3.12 issue.py
spec: '\\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 the format() 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)

Linked PRs

Metadata

Metadata

Labels

type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    Morty Proxy This is a proxified and sanitized view of the page, visit original site.