Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Doc/c-api/object.rst
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ Object Protocol
in favour of using :c:func:`PyObject_DelAttr`, but there are currently no
plans to remove it.

The function must not be called with ``NULL`` *v* and an an exception set.
The function must not be called with a ``NULL`` *v* and an exception set.
This case can arise from forgetting ``NULL`` checks and would delete the
attribute.

Expand All @@ -214,7 +214,7 @@ Object Protocol
If *v* is ``NULL``, the attribute is deleted, but this feature is
deprecated in favour of using :c:func:`PyObject_DelAttrString`.

The function must not be called with ``NULL`` *v* and an an exception set.
The function must not be called with a ``NULL`` *v* and an exception set.
This case can arise from forgetting ``NULL`` checks and would delete the
attribute.

Expand Down
2 changes: 1 addition & 1 deletion Doc/library/urllib.request.rst
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,7 @@ The following attribute and methods should only be used by classes derived from
1. a :class:`Request` object,
#. a file-like object with the HTTP error body,
#. the three-digit code of the error, as a string,
#. the user-visible explanation of the code, as as string, and
#. the user-visible explanation of the code, as a string, and
#. the headers of the error, as a mapping object.

Return values and exceptions raised should be the same as those of
Expand Down
2 changes: 1 addition & 1 deletion Doc/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ sphinx~=8.2.0

blurb

sphinxext-opengraph~=0.10.0
sphinxext-opengraph~=0.11.0
sphinx-notfound-page~=1.0.0

# The theme used by the documentation is stored separately, so we need
Expand Down
2 changes: 1 addition & 1 deletion Doc/whatsnew/3.15.rst
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ Other language changes
compatibility between versions of Python, ensure that an explicit ``encoding``
argument is always provided. The :ref:`opt-in encoding warning <io-encoding-warning>`
can be used to identify code that may be affected by this change.
The special special ``encoding='locale'`` argument uses the current locale
The special ``encoding='locale'`` argument uses the current locale
encoding, and has been supported since Python 3.10.

To retain the previous behaviour, Python's UTF-8 mode may be disabled with
Expand Down
4 changes: 2 additions & 2 deletions Lib/asyncio/base_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ def _check_running(self):
def _run_forever_setup(self):
"""Prepare the run loop to process events.

This method exists so that custom custom event loop subclasses (e.g., event loops
This method exists so that custom event loop subclasses (e.g., event loops
that integrate a GUI event loop with Python's event loop) have access to all the
loop setup logic.
"""
Expand All @@ -656,7 +656,7 @@ def _run_forever_setup(self):
def _run_forever_cleanup(self):
"""Clean up after an event loop finishes the looping over events.

This method exists so that custom custom event loop subclasses (e.g., event loops
This method exists so that custom event loop subclasses (e.g., event loops
that integrate a GUI event loop with Python's event loop) have access to all the
loop cleanup logic.
"""
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/libregrtest/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ def normalize_test_name(test_full_name: str, *,
if is_error and short_name in _TEST_LIFECYCLE_HOOKS:
if test_full_name.startswith(('setUpModule (', 'tearDownModule (')):
# if setUpModule() or tearDownModule() failed, don't filter
# tests with the test file name, don't use use filters.
# tests with the test file name, don't use filters.
return None

# This means that we have a failure in a life-cycle hook,
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1686,7 +1686,7 @@ def check__all__(test_case, module, name_of_module=None, extra=(),
'module'.

The 'name_of_module' argument can specify (as a string or tuple thereof)
what module(s) an API could be defined in in order to be detected as a
what module(s) an API could be defined in order to be detected as a
public API. One case for this is when 'module' imports part of its public
API from other modules, possibly a C backend (like 'csv' and its '_csv').

Expand Down
28 changes: 28 additions & 0 deletions Lib/test/test_fstring.py
Original file line number Diff line number Diff line change
Expand Up @@ -1831,6 +1831,34 @@ def test_newlines_in_format_specifiers(self):
for case in valid_cases:
compile(case, "<string>", "exec")

def test_raw_fstring_format_spec(self):
# Test raw f-string format spec behavior (Issue #137314).
#
# Raw f-strings should preserve literal backslashes in format specifications,
# not interpret them as escape sequences.
class UnchangedFormat:
"""Test helper that returns the format spec unchanged."""
def __format__(self, format):
return format

# Test basic escape sequences
self.assertEqual(f"{UnchangedFormat():\xFF}", 'ÿ')
self.assertEqual(rf"{UnchangedFormat():\xFF}", '\\xFF')

# Test nested expressions with raw/non-raw combinations
self.assertEqual(rf"{UnchangedFormat():{'\xFF'}}", 'ÿ')
self.assertEqual(f"{UnchangedFormat():{r'\xFF'}}", '\\xFF')
self.assertEqual(rf"{UnchangedFormat():{r'\xFF'}}", '\\xFF')

# Test continuation character in format specs
self.assertEqual(f"""{UnchangedFormat():{'a'\
'b'}}""", 'ab')
self.assertEqual(rf"""{UnchangedFormat():{'a'\
'b'}}""", 'ab')

# Test multiple format specs in same raw f-string
self.assertEqual(rf"{UnchangedFormat():\xFF} {UnchangedFormat():\n}", '\\xFF \\n')


if __name__ == '__main__':
unittest.main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Fixed a regression where raw f-strings incorrectly interpreted
escape sequences in format specifications. Raw f-strings now properly preserve
literal backslashes in format specs, matching the behavior from Python 3.11.
For example, ``rf"{obj:\xFF}"`` now correctly produces ``'\\xFF'`` instead of
``'ÿ'``. Patch by Pablo Galindo.
10 changes: 9 additions & 1 deletion Parser/action_helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -1404,7 +1404,15 @@ expr_ty _PyPegen_decoded_constant_from_token(Parser* p, Token* tok) {
if (PyBytes_AsStringAndSize(tok->bytes, &bstr, &bsize) == -1) {
return NULL;
}
PyObject* str = _PyPegen_decode_string(p, 0, bstr, bsize, tok);

// Check if we're inside a raw f-string for format spec decoding
int is_raw = 0;
if (INSIDE_FSTRING(p->tok)) {
tokenizer_mode *mode = TOK_GET_MODE(p->tok);
is_raw = mode->raw;
}

PyObject* str = _PyPegen_decode_string(p, is_raw, bstr, bsize, tok);
if (str == NULL) {
return NULL;
}
Expand Down
8 changes: 7 additions & 1 deletion Tools/cases_generator/interpreter_definition.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,13 @@ list of annotations and their meanings are as follows:
* `override`. For external use by other interpreter definitions to override the current
instruction definition.
* `pure`. This instruction has no side effects.
* 'tierN'. This instruction is only used by the tier N interpreter.
* `tierN`. This instruction is only used by the tier N interpreter.
* `specializing`. A prefix for an instructions related to adaptive interpreter.
* `replaced`. This instruction will be replaced in the final bytecode by its directed
version (either forward or backward).
* `register`. Currently does nothing.
* `replicate(N)`. Replicate the instruction N times to store the oparg "inside" the instruction.
* `no_save_ip`. This instruction does not affect the instruction pointer.

### Special functions/macros

Expand Down
Loading