Skip to content

Commit cd4be03

Browse files
authored
Merge branch 'main' into build-ubuntu-24.04
2 parents 05cc76b + 8a2baed commit cd4be03

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1043
-675
lines changed

.github/CODEOWNERS

+6-5
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ Python/compile.c @markshannon @iritkatriel
3838
Python/assemble.c @markshannon @iritkatriel
3939
Python/flowgraph.c @markshannon @iritkatriel
4040
Python/instruction_sequence.c @iritkatriel
41-
Python/ast_opt.c @isidentical
4241
Python/bytecodes.c @markshannon
4342
Python/optimizer*.c @markshannon
4443
Python/optimizer_analysis.c @Fidget-Spinner
@@ -158,10 +157,12 @@ Include/internal/pycore_time.h @pganssle @abalkin
158157
/Tools/cases_generator/ @markshannon
159158

160159
# AST
161-
Python/ast.c @isidentical @JelleZijlstra
162-
Parser/asdl.py @isidentical @JelleZijlstra
163-
Parser/asdl_c.py @isidentical @JelleZijlstra
164-
Lib/ast.py @isidentical @JelleZijlstra
160+
Python/ast.c @isidentical @JelleZijlstra @eclips4
161+
Python/ast_opt.c @isidentical @eclips4
162+
Parser/asdl.py @isidentical @JelleZijlstra @eclips4
163+
Parser/asdl_c.py @isidentical @JelleZijlstra @eclips4
164+
Lib/ast.py @isidentical @JelleZijlstra @eclips4
165+
Lib/test/test_ast/ @eclips4
165166

166167
# Mock
167168
/Lib/unittest/mock.py @cjw296

.pre-commit-config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/astral-sh/ruff-pre-commit
3-
rev: v0.4.10
3+
rev: v0.6.7
44
hooks:
55
- id: ruff
66
name: Run Ruff (lint) on Doc/

Doc/Makefile

+31-1
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,26 @@ venv:
182182
echo "The venv has been created in the $(VENVDIR) directory"; \
183183
fi
184184

185+
.PHONY: dist-no-html
186+
dist-no-html: dist-text dist-pdf dist-epub dist-texinfo
187+
185188
.PHONY: dist
186189
dist:
187190
rm -rf dist
188191
mkdir -p dist
189-
192+
$(MAKE) dist-html
193+
$(MAKE) dist-text
194+
$(MAKE) dist-pdf
195+
$(MAKE) dist-epub
196+
$(MAKE) dist-texinfo
197+
198+
.PHONY: dist-html
199+
dist-html:
190200
# archive the HTML
191201
@echo "Building HTML..."
202+
mkdir -p dist
203+
rm -rf build/html
204+
find dist -name 'python-$(DISTVERSION)-docs-html*' -exec rm -rf {} \;
192205
$(MAKE) html
193206
cp -pPR build/html dist/python-$(DISTVERSION)-docs-html
194207
tar -C dist -cf dist/python-$(DISTVERSION)-docs-html.tar python-$(DISTVERSION)-docs-html
@@ -198,8 +211,13 @@ dist:
198211
rm dist/python-$(DISTVERSION)-docs-html.tar
199212
@echo "Build finished and archived!"
200213

214+
.PHONY: dist-text
215+
dist-text:
201216
# archive the text build
202217
@echo "Building text..."
218+
mkdir -p dist
219+
rm -rf build/text
220+
find dist -name 'python-$(DISTVERSION)-docs-text*' -exec rm -rf {} \;
203221
$(MAKE) text
204222
cp -pPR build/text dist/python-$(DISTVERSION)-docs-text
205223
tar -C dist -cf dist/python-$(DISTVERSION)-docs-text.tar python-$(DISTVERSION)-docs-text
@@ -209,9 +227,13 @@ dist:
209227
rm dist/python-$(DISTVERSION)-docs-text.tar
210228
@echo "Build finished and archived!"
211229

230+
.PHONY: dist-pdf
231+
dist-pdf:
212232
# archive the A4 latex
213233
@echo "Building LaTeX (A4 paper)..."
234+
mkdir -p dist
214235
rm -rf build/latex
236+
find dist -name 'python-$(DISTVERSION)-docs-pdf*' -exec rm -rf {} \;
215237
$(MAKE) latex PAPER=a4
216238
# remove zip & bz2 dependency on all-pdf,
217239
# as otherwise the full latexmk process is run twice.
@@ -222,16 +244,24 @@ dist:
222244
cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-a4.tar.bz2
223245
@echo "Build finished and archived!"
224246

247+
.PHONY: dist-epub
248+
dist-epub:
225249
# copy the epub build
226250
@echo "Building EPUB..."
251+
mkdir -p dist
227252
rm -rf build/epub
253+
rm -f dist/python-$(DISTVERSION)-docs.epub
228254
$(MAKE) epub
229255
cp -pPR build/epub/Python.epub dist/python-$(DISTVERSION)-docs.epub
230256
@echo "Build finished and archived!"
231257

258+
.PHONY: dist-texinfo
259+
dist-texinfo:
232260
# archive the texinfo build
233261
@echo "Building Texinfo..."
262+
mkdir -p dist
234263
rm -rf build/texinfo
264+
find dist -name 'python-$(DISTVERSION)-docs-texinfo*' -exec rm -rf {} \;
235265
$(MAKE) texinfo
236266
$(MAKE) info --directory=build/texinfo
237267
cp -pPR build/texinfo dist/python-$(DISTVERSION)-docs-texinfo

Doc/c-api/monitoring.rst

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.. highlight:: c
22

3-
.. _monitoring:
3+
.. _c-api-monitoring:
44

55
Monitoring C API
66
================
@@ -141,18 +141,18 @@ would typically correspond to a python function.
141141
to the base-2 logarithm of ``sys.monitoring.events.PY_START``.
142142
``state_array`` is an array with a monitoring state entry for each event in
143143
``event_types``, it is allocated by the user but populated by
144-
``PyMonitoring_EnterScope`` with information about the activation state of
144+
:c:func:`!PyMonitoring_EnterScope` with information about the activation state of
145145
the event. The size of ``event_types`` (and hence also of ``state_array``)
146146
is given in ``length``.
147147
148148
The ``version`` argument is a pointer to a value which should be allocated
149149
by the user together with ``state_array`` and initialized to 0,
150-
and then set only by ``PyMonitoring_EnterScope`` itelf. It allows this
150+
and then set only by :c:func:`!PyMonitoring_EnterScope` itelf. It allows this
151151
function to determine whether event states have changed since the previous call,
152152
and to return quickly if they have not.
153153
154154
The scopes referred to here are lexical scopes: a function, class or method.
155-
``PyMonitoring_EnterScope`` should be called whenever the lexical scope is
155+
:c:func:`!PyMonitoring_EnterScope` should be called whenever the lexical scope is
156156
entered. Scopes can be reentered, reusing the same *state_array* and *version*,
157157
in situations like when emulating a recursive Python function. When a code-like's
158158
execution is paused, such as when emulating a generator, the scope needs to
@@ -189,4 +189,4 @@ would typically correspond to a python function.
189189
190190
.. c:function:: int PyMonitoring_ExitScope(void)
191191
192-
Exit the last scope that was entered with ``PyMonitoring_EnterScope``.
192+
Exit the last scope that was entered with :c:func:`!PyMonitoring_EnterScope`.

Doc/c-api/time.rst

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
.. highlight:: c
22

3+
.. _c-api-time:
4+
35
PyTime C API
46
============
57

Doc/deprecations/c-api-pending-removal-in-3.14.rst

+51-25
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,64 @@ Pending Removal in Python 3.14
99

1010
* Functions to configure Python's initialization, deprecated in Python 3.11:
1111

12-
* ``PySys_SetArgvEx()``: set :c:member:`PyConfig.argv` instead.
13-
* ``PySys_SetArgv()``: set :c:member:`PyConfig.argv` instead.
14-
* ``Py_SetProgramName()``: set :c:member:`PyConfig.program_name` instead.
15-
* ``Py_SetPythonHome()``: set :c:member:`PyConfig.home` instead.
12+
* :c:func:`!PySys_SetArgvEx()`:
13+
Set :c:member:`PyConfig.argv` instead.
14+
* :c:func:`!PySys_SetArgv()`:
15+
Set :c:member:`PyConfig.argv` instead.
16+
* :c:func:`!Py_SetProgramName()`:
17+
Set :c:member:`PyConfig.program_name` instead.
18+
* :c:func:`!Py_SetPythonHome()`:
19+
Set :c:member:`PyConfig.home` instead.
1620

1721
The :c:func:`Py_InitializeFromConfig` API should be used with
1822
:c:type:`PyConfig` instead.
1923

2024
* Global configuration variables:
2125

22-
* :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug` instead.
23-
* :c:var:`Py_VerboseFlag`: use :c:member:`PyConfig.verbose` instead.
24-
* :c:var:`Py_QuietFlag`: use :c:member:`PyConfig.quiet` instead.
25-
* :c:var:`Py_InteractiveFlag`: use :c:member:`PyConfig.interactive` instead.
26-
* :c:var:`Py_InspectFlag`: use :c:member:`PyConfig.inspect` instead.
27-
* :c:var:`Py_OptimizeFlag`: use :c:member:`PyConfig.optimization_level` instead.
28-
* :c:var:`Py_NoSiteFlag`: use :c:member:`PyConfig.site_import` instead.
29-
* :c:var:`Py_BytesWarningFlag`: use :c:member:`PyConfig.bytes_warning` instead.
30-
* :c:var:`Py_FrozenFlag`: use :c:member:`PyConfig.pathconfig_warnings` instead.
31-
* :c:var:`Py_IgnoreEnvironmentFlag`: use :c:member:`PyConfig.use_environment` instead.
32-
* :c:var:`Py_DontWriteBytecodeFlag`: use :c:member:`PyConfig.write_bytecode` instead.
33-
* :c:var:`Py_NoUserSiteDirectory`: use :c:member:`PyConfig.user_site_directory` instead.
34-
* :c:var:`Py_UnbufferedStdioFlag`: use :c:member:`PyConfig.buffered_stdio` instead.
35-
* :c:var:`Py_HashRandomizationFlag`: use :c:member:`PyConfig.use_hash_seed`
26+
* :c:var:`Py_DebugFlag`:
27+
Use :c:member:`PyConfig.parser_debug` instead.
28+
* :c:var:`Py_VerboseFlag`:
29+
Use :c:member:`PyConfig.verbose` instead.
30+
* :c:var:`Py_QuietFlag`:
31+
Use :c:member:`PyConfig.quiet` instead.
32+
* :c:var:`Py_InteractiveFlag`:
33+
Use :c:member:`PyConfig.interactive` instead.
34+
* :c:var:`Py_InspectFlag`:
35+
Use :c:member:`PyConfig.inspect` instead.
36+
* :c:var:`Py_OptimizeFlag`:
37+
Use :c:member:`PyConfig.optimization_level` instead.
38+
* :c:var:`Py_NoSiteFlag`:
39+
Use :c:member:`PyConfig.site_import` instead.
40+
* :c:var:`Py_BytesWarningFlag`:
41+
Use :c:member:`PyConfig.bytes_warning` instead.
42+
* :c:var:`Py_FrozenFlag`:
43+
Use :c:member:`PyConfig.pathconfig_warnings` instead.
44+
* :c:var:`Py_IgnoreEnvironmentFlag`:
45+
Use :c:member:`PyConfig.use_environment` instead.
46+
* :c:var:`Py_DontWriteBytecodeFlag`:
47+
Use :c:member:`PyConfig.write_bytecode` instead.
48+
* :c:var:`Py_NoUserSiteDirectory`:
49+
Use :c:member:`PyConfig.user_site_directory` instead.
50+
* :c:var:`Py_UnbufferedStdioFlag`:
51+
Use :c:member:`PyConfig.buffered_stdio` instead.
52+
* :c:var:`Py_HashRandomizationFlag`:
53+
Use :c:member:`PyConfig.use_hash_seed`
3654
and :c:member:`PyConfig.hash_seed` instead.
37-
* :c:var:`Py_IsolatedFlag`: use :c:member:`PyConfig.isolated` instead.
38-
* :c:var:`Py_LegacyWindowsFSEncodingFlag`: use :c:member:`PyPreConfig.legacy_windows_fs_encoding` instead.
39-
* :c:var:`Py_LegacyWindowsStdioFlag`: use :c:member:`PyConfig.legacy_windows_stdio` instead.
40-
* :c:var:`!Py_FileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` instead.
41-
* :c:var:`!Py_HasFileSystemDefaultEncoding`: use :c:member:`PyConfig.filesystem_encoding` instead.
42-
* :c:var:`!Py_FileSystemDefaultEncodeErrors`: use :c:member:`PyConfig.filesystem_errors` instead.
43-
* :c:var:`!Py_UTF8Mode`: use :c:member:`PyPreConfig.utf8_mode` instead. (see :c:func:`Py_PreInitialize`)
55+
* :c:var:`Py_IsolatedFlag`:
56+
Use :c:member:`PyConfig.isolated` instead.
57+
* :c:var:`Py_LegacyWindowsFSEncodingFlag`:
58+
Use :c:member:`PyPreConfig.legacy_windows_fs_encoding` instead.
59+
* :c:var:`Py_LegacyWindowsStdioFlag`:
60+
Use :c:member:`PyConfig.legacy_windows_stdio` instead.
61+
* :c:var:`!Py_FileSystemDefaultEncoding`:
62+
Use :c:member:`PyConfig.filesystem_encoding` instead.
63+
* :c:var:`!Py_HasFileSystemDefaultEncoding`:
64+
Use :c:member:`PyConfig.filesystem_encoding` instead.
65+
* :c:var:`!Py_FileSystemDefaultEncodeErrors`:
66+
Use :c:member:`PyConfig.filesystem_errors` instead.
67+
* :c:var:`!Py_UTF8Mode`:
68+
Use :c:member:`PyPreConfig.utf8_mode` instead.
69+
(see :c:func:`Py_PreInitialize`)
4470

4571
The :c:func:`Py_InitializeFromConfig` API should be used with
4672
:c:type:`PyConfig` instead.

Doc/deprecations/c-api-pending-removal-in-3.15.rst

+21-14
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,26 @@ Pending Removal in Python 3.15
22
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
33

44
* The bundled copy of ``libmpdecimal``.
5-
* :c:func:`PyImport_ImportModuleNoBlock`: use :c:func:`PyImport_ImportModule` instead.
6-
* :c:func:`PyWeakref_GET_OBJECT`: use :c:func:`PyWeakref_GetRef` instead.
7-
* :c:func:`PyWeakref_GetObject`: use :c:func:`PyWeakref_GetRef` instead.
8-
* :c:type:`!Py_UNICODE_WIDE` type: use :c:type:`wchar_t` instead.
9-
* :c:type:`Py_UNICODE` type: use :c:type:`wchar_t` instead.
5+
* The :c:func:`PyImport_ImportModuleNoBlock`:
6+
Use :c:func:`PyImport_ImportModule` instead.
7+
* :c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`:
8+
Use :c:func:`PyWeakref_GetRef` instead.
9+
* :c:type:`Py_UNICODE` type and the :c:macro:`!Py_UNICODE_WIDE` macro:
10+
Use :c:type:`wchar_t` instead.
1011
* Python initialization functions:
1112

12-
* :c:func:`PySys_ResetWarnOptions`: clear :data:`sys.warnoptions` and
13-
:data:`!warnings.filters` instead.
14-
* :c:func:`Py_GetExecPrefix`: get :data:`sys.exec_prefix` instead.
15-
* :c:func:`Py_GetPath`: get :data:`sys.path` instead.
16-
* :c:func:`Py_GetPrefix`: get :data:`sys.prefix` instead.
17-
* :c:func:`Py_GetProgramFullPath`: get :data:`sys.executable` instead.
18-
* :c:func:`Py_GetProgramName`: get :data:`sys.executable` instead.
19-
* :c:func:`Py_GetPythonHome`: get :c:member:`PyConfig.home` or
20-
the :envvar:`PYTHONHOME` environment variable instead.
13+
* :c:func:`PySys_ResetWarnOptions`:
14+
Clear :data:`sys.warnoptions` and :data:`!warnings.filters` instead.
15+
* :c:func:`Py_GetExecPrefix`:
16+
Get :data:`sys.exec_prefix` instead.
17+
* :c:func:`Py_GetPath`:
18+
Get :data:`sys.path` instead.
19+
* :c:func:`Py_GetPrefix`:
20+
Get :data:`sys.prefix` instead.
21+
* :c:func:`Py_GetProgramFullPath`:
22+
Get :data:`sys.executable` instead.
23+
* :c:func:`Py_GetProgramName`:
24+
Get :data:`sys.executable` instead.
25+
* :c:func:`Py_GetPythonHome`:
26+
Get :c:member:`PyConfig.home`
27+
or the :envvar:`PYTHONHOME` environment variable instead.

Doc/deprecations/c-api-pending-removal-in-future.rst

+40-20
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,48 @@ Pending Removal in Future Versions
44
The following APIs are deprecated and will be removed,
55
although there is currently no date scheduled for their removal.
66

7-
* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: unneeded since Python 3.8.
8-
* :c:func:`PyErr_Fetch`: use :c:func:`PyErr_GetRaisedException` instead.
9-
* :c:func:`PyErr_NormalizeException`: use :c:func:`PyErr_GetRaisedException` instead.
10-
* :c:func:`PyErr_Restore`: use :c:func:`PyErr_SetRaisedException` instead.
11-
* :c:func:`PyModule_GetFilename`: use :c:func:`PyModule_GetFilenameObject` instead.
12-
* :c:func:`PyOS_AfterFork`: use :c:func:`PyOS_AfterFork_Child` instead.
13-
* :c:func:`PySlice_GetIndicesEx`: use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` instead.
14-
* :c:func:`!PyUnicode_AsDecodedObject`: use :c:func:`PyCodec_Decode` instead.
15-
* :c:func:`!PyUnicode_AsDecodedUnicode`: use :c:func:`PyCodec_Decode` instead.
16-
* :c:func:`!PyUnicode_AsEncodedObject`: use :c:func:`PyCodec_Encode` instead.
17-
* :c:func:`!PyUnicode_AsEncodedUnicode`: use :c:func:`PyCodec_Encode` instead.
18-
* :c:func:`PyUnicode_READY`: unneeded since Python 3.12
19-
* :c:func:`!PyErr_Display`: use :c:func:`PyErr_DisplayException` instead.
20-
* :c:func:`!_PyErr_ChainExceptions`: use ``_PyErr_ChainExceptions1`` instead.
7+
* :c:macro:`Py_TPFLAGS_HAVE_FINALIZE`:
8+
Unneeded since Python 3.8.
9+
* :c:func:`PyErr_Fetch`:
10+
Use :c:func:`PyErr_GetRaisedException` instead.
11+
* :c:func:`PyErr_NormalizeException`:
12+
Use :c:func:`PyErr_GetRaisedException` instead.
13+
* :c:func:`PyErr_Restore`:
14+
Use :c:func:`PyErr_SetRaisedException` instead.
15+
* :c:func:`PyModule_GetFilename`:
16+
Use :c:func:`PyModule_GetFilenameObject` instead.
17+
* :c:func:`PyOS_AfterFork`:
18+
Use :c:func:`PyOS_AfterFork_Child` instead.
19+
* :c:func:`PySlice_GetIndicesEx`:
20+
Use :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` instead.
21+
* :c:func:`!PyUnicode_AsDecodedObject`:
22+
Use :c:func:`PyCodec_Decode` instead.
23+
* :c:func:`!PyUnicode_AsDecodedUnicode`:
24+
Use :c:func:`PyCodec_Decode` instead.
25+
* :c:func:`!PyUnicode_AsEncodedObject`:
26+
Use :c:func:`PyCodec_Encode` instead.
27+
* :c:func:`!PyUnicode_AsEncodedUnicode`:
28+
Use :c:func:`PyCodec_Encode` instead.
29+
* :c:func:`PyUnicode_READY`:
30+
Unneeded since Python 3.12
31+
* :c:func:`!PyErr_Display`:
32+
Use :c:func:`PyErr_DisplayException` instead.
33+
* :c:func:`!_PyErr_ChainExceptions`:
34+
Use :c:func:`!_PyErr_ChainExceptions1` instead.
2135
* :c:member:`!PyBytesObject.ob_shash` member:
2236
call :c:func:`PyObject_Hash` instead.
2337
* :c:member:`!PyDictObject.ma_version_tag` member.
2438
* Thread Local Storage (TLS) API:
2539

26-
* :c:func:`PyThread_create_key`: use :c:func:`PyThread_tss_alloc` instead.
27-
* :c:func:`PyThread_delete_key`: use :c:func:`PyThread_tss_free` instead.
28-
* :c:func:`PyThread_set_key_value`: use :c:func:`PyThread_tss_set` instead.
29-
* :c:func:`PyThread_get_key_value`: use :c:func:`PyThread_tss_get` instead.
30-
* :c:func:`PyThread_delete_key_value`: use :c:func:`PyThread_tss_delete` instead.
31-
* :c:func:`PyThread_ReInitTLS`: unneeded since Python 3.7.
40+
* :c:func:`PyThread_create_key`:
41+
Use :c:func:`PyThread_tss_alloc` instead.
42+
* :c:func:`PyThread_delete_key`:
43+
Use :c:func:`PyThread_tss_free` instead.
44+
* :c:func:`PyThread_set_key_value`:
45+
Use :c:func:`PyThread_tss_set` instead.
46+
* :c:func:`PyThread_get_key_value`:
47+
Use :c:func:`PyThread_tss_get` instead.
48+
* :c:func:`PyThread_delete_key_value`:
49+
Use :c:func:`PyThread_tss_delete` instead.
50+
* :c:func:`PyThread_ReInitTLS`:
51+
Unneeded since Python 3.7.

Doc/deprecations/pending-removal-in-3.14.rst

-3
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ Pending Removal in Python 3.14
4747
* :mod:`email`: Deprecated the *isdst* parameter in :func:`email.utils.localtime`.
4848
(Contributed by Alan Williams in :gh:`72346`.)
4949

50-
* :mod:`importlib`: ``__package__`` and ``__cached__`` will cease to be set or
51-
taken into consideration by the import system (:gh:`97879`).
52-
5350
* :mod:`importlib.abc` deprecated classes:
5451

5552
* :class:`!importlib.abc.ResourceReader`

Doc/deprecations/pending-removal-in-3.15.rst

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ Pending Removal in Python 3.15
1717
* The :option:`!--cgi` flag to the :program:`python -m http.server`
1818
command-line interface has been deprecated since Python 3.13.
1919

20+
* :mod:`importlib`: ``__package__`` and ``__cached__`` will cease to be set or
21+
taken into consideration by the import system (:gh:`97879`).
22+
2023
* :class:`locale`:
2124

2225
* The :func:`~locale.getdefaultlocale` function

Doc/glossary.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ Glossary
11311131
:class:`tuple`, and :class:`bytes`. Note that :class:`dict` also
11321132
supports :meth:`~object.__getitem__` and :meth:`!__len__`, but is considered a
11331133
mapping rather than a sequence because the lookups use arbitrary
1134-
:term:`immutable` keys rather than integers.
1134+
:term:`hashable` keys rather than integers.
11351135

11361136
The :class:`collections.abc.Sequence` abstract base class
11371137
defines a much richer interface that goes beyond just

0 commit comments

Comments
 (0)