Skip to content

Commit d229f57

Browse files
Merge remote-tracking branch 'upstream/main' into pure
2 parents b4c2e93 + 366d95d commit d229f57

File tree

244 files changed

+4657
-2530
lines changed

Some content is hidden

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

244 files changed

+4657
-2530
lines changed

.github/workflows/build.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ permissions:
1515
contents: read
1616

1717
concurrency:
18-
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}-reusable
18+
# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#concurrency
19+
# 'group' must be a key uniquely representing a PR or push event.
20+
# github.workflow is the workflow name
21+
# github.actor is the user invoking the workflow
22+
# github.head_ref is the source branch of the PR or otherwise blank
23+
# github.run_id is a unique number for the current run
24+
group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }}
1925
cancel-in-progress: true
2026

2127
env:

Doc/c-api/typeobj.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Quick Reference
7979
| :c:member:`~PyTypeObject.tp_setattro` | :c:type:`setattrofunc` | __setattr__, | X | X | | G |
8080
| | | __delattr__ | | | | |
8181
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
82-
| :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | | | | | % |
82+
| :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | :ref:`sub-slots` | | | | % |
8383
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
8484
| :c:member:`~PyTypeObject.tp_flags` | unsigned long | | X | X | | ? |
8585
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
@@ -325,9 +325,10 @@ sub-slots
325325
+---------------------------------------------------------+-----------------------------------+---------------+
326326
| |
327327
+---------------------------------------------------------+-----------------------------------+---------------+
328-
| :c:member:`~PyBufferProcs.bf_getbuffer` | :c:func:`getbufferproc` | |
328+
| :c:member:`~PyBufferProcs.bf_getbuffer` | :c:func:`getbufferproc` | __buffer__ |
329329
+---------------------------------------------------------+-----------------------------------+---------------+
330-
| :c:member:`~PyBufferProcs.bf_releasebuffer` | :c:func:`releasebufferproc` | |
330+
| :c:member:`~PyBufferProcs.bf_releasebuffer` | :c:func:`releasebufferproc` | __release_\ |
331+
| | | buffer\__ |
331332
+---------------------------------------------------------+-----------------------------------+---------------+
332333

333334
.. _slot-typedefs-table:

Doc/howto/annotations.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,9 @@ quirks by using :func:`annotationlib.get_annotations` on Python 3.14+ or
248248
:func:`inspect.get_annotations` on Python 3.10+. On earlier versions of
249249
Python, you can avoid these bugs by accessing the annotations from the
250250
class's :attr:`~type.__dict__`
251-
(e.g., ``cls.__dict__.get('__annotations__', None)``).
251+
(for example, ``cls.__dict__.get('__annotations__', None)``).
252+
253+
In some versions of Python, instances of classes may have an ``__annotations__``
254+
attribute. However, this is not supported functionality. If you need the
255+
annotations of an instance, you can use :func:`type` to access its class
256+
(for example, ``annotationlib.get_annotations(type(myinstance))`` on Python 3.14+).

Doc/howto/free-threading-python.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ optionally support installing free-threaded Python binaries. The installers
3232
are available at https://www.python.org/downloads/.
3333

3434
For information on other platforms, see the `Installing a Free-Threaded Python
35-
<https://py-free-threading.github.io/installing_cpython/>`_, a
35+
<https://py-free-threading.github.io/installing-cpython/>`_, a
3636
community-maintained installation guide for installing free-threaded Python.
3737

3838
When building CPython from source, the :option:`--disable-gil` configure option

Doc/howto/isolating-extensions.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,21 +215,36 @@ multiple interpreters correctly. If this is not yet the case for your
215215
module, you can explicitly make your module loadable only once per
216216
process. For example::
217217

218+
// A process-wide flag
218219
static int loaded = 0;
219220

221+
// Mutex to provide thread safety (only needed for free-threaded Python)
222+
static PyMutex modinit_mutex = {0};
223+
220224
static int
221225
exec_module(PyObject* module)
222226
{
227+
PyMutex_Lock(&modinit_mutex);
223228
if (loaded) {
229+
PyMutex_Unlock(&modinit_mutex);
224230
PyErr_SetString(PyExc_ImportError,
225231
"cannot load module more than once per process");
226232
return -1;
227233
}
228234
loaded = 1;
235+
PyMutex_Unlock(&modinit_mutex);
229236
// ... rest of initialization
230237
}
231238

232239

240+
If your module's :c:member:`PyModuleDef.m_clear` function is able to prepare
241+
for future re-initialization, it should clear the ``loaded`` flag.
242+
In this case, your module won't support multiple instances existing
243+
*concurrently*, but it will, for example, support being loaded after
244+
Python runtime shutdown (:c:func:`Py_FinalizeEx`) and re-initialization
245+
(:c:func:`Py_Initialize`).
246+
247+
233248
Module State Access from Functions
234249
----------------------------------
235250

Doc/library/archiving.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ Data Compression and Archiving
55
******************************
66

77
The modules described in this chapter support data compression with the zlib,
8-
gzip, bzip2 and lzma algorithms, and the creation of ZIP- and tar-format
8+
gzip, bzip2, lzma, and zstd algorithms, and the creation of ZIP- and tar-format
99
archives. See also :ref:`archiving-operations` provided by the :mod:`shutil`
1010
module.
1111

1212

1313
.. toctree::
1414

15+
compression.rst
16+
compression.zstd.rst
1517
zlib.rst
1618
gzip.rst
1719
bz2.rst

Doc/library/asyncio-eventloop.rst

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ Creating Futures and Tasks
361361

362362
.. versionadded:: 3.5.2
363363

364-
.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None)
364+
.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None, **kwargs)
365365

366366
Schedule the execution of :ref:`coroutine <coroutine>` *coro*.
367367
Return a :class:`Task` object.
@@ -370,6 +370,10 @@ Creating Futures and Tasks
370370
for interoperability. In this case, the result type is a subclass
371371
of :class:`Task`.
372372

373+
The full function signature is largely the same as that of the
374+
:class:`Task` constructor (or factory) - all of the keyword arguments to
375+
this function are passed through to that interface.
376+
373377
If the *name* argument is provided and not ``None``, it is set as
374378
the name of the task using :meth:`Task.set_name`.
375379

@@ -388,8 +392,15 @@ Creating Futures and Tasks
388392
.. versionchanged:: 3.11
389393
Added the *context* parameter.
390394

395+
.. versionchanged:: 3.13.3
396+
Added ``kwargs`` which passes on arbitrary extra parameters, including ``name`` and ``context``.
397+
398+
.. versionchanged:: 3.13.4
399+
Rolled back the change that passes on *name* and *context* (if it is None),
400+
while still passing on other arbitrary keyword arguments (to avoid breaking backwards compatibility with 3.13.3).
401+
391402
.. versionchanged:: 3.14
392-
Added the *eager_start* parameter.
403+
All *kwargs* are now passed on. The *eager_start* parameter works with eager task factories.
393404

394405
.. method:: loop.set_task_factory(factory)
395406

@@ -402,6 +413,16 @@ Creating Futures and Tasks
402413
event loop, and *coro* is a coroutine object. The callable
403414
must pass on all *kwargs*, and return a :class:`asyncio.Task`-compatible object.
404415

416+
.. versionchanged:: 3.13.3
417+
Required that all *kwargs* are passed on to :class:`asyncio.Task`.
418+
419+
.. versionchanged:: 3.13.4
420+
*name* is no longer passed to task factories. *context* is no longer passed
421+
to task factories if it is ``None``.
422+
423+
.. versionchanged:: 3.14
424+
*name* and *context* are now unconditionally passed on to task factories again.
425+
405426
.. method:: loop.get_task_factory()
406427

407428
Return a task factory or ``None`` if the default one is in use.

Doc/library/asyncio-task.rst

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,18 +238,24 @@ Creating Tasks
238238

239239
-----------------------------------------------
240240

241-
.. function:: create_task(coro, *, name=None, context=None)
241+
.. function:: create_task(coro, *, name=None, context=None, eager_start=None, **kwargs)
242242

243243
Wrap the *coro* :ref:`coroutine <coroutine>` into a :class:`Task`
244244
and schedule its execution. Return the Task object.
245245

246-
If *name* is not ``None``, it is set as the name of the task using
247-
:meth:`Task.set_name`.
246+
The full function signature is largely the same as that of the
247+
:class:`Task` constructor (or factory) - all of the keyword arguments to
248+
this function are passed through to that interface.
248249

249250
An optional keyword-only *context* argument allows specifying a
250251
custom :class:`contextvars.Context` for the *coro* to run in.
251252
The current context copy is created when no *context* is provided.
252253

254+
An optional keyword-only *eager_start* argument allows specifying
255+
if the task should execute eagerly during the call to create_task,
256+
or be scheduled later. If *eager_start* is not passed the mode set
257+
by :meth:`loop.set_task_factory` will be used.
258+
253259
The task is executed in the loop returned by :func:`get_running_loop`,
254260
:exc:`RuntimeError` is raised if there is no running loop in
255261
current thread.
@@ -290,6 +296,9 @@ Creating Tasks
290296
.. versionchanged:: 3.11
291297
Added the *context* parameter.
292298

299+
.. versionchanged:: 3.14
300+
Added the *eager_start* parameter by passing on all *kwargs*.
301+
293302

294303
Task Cancellation
295304
=================
@@ -330,7 +339,7 @@ and reliable way to wait for all tasks in the group to finish.
330339

331340
.. versionadded:: 3.11
332341

333-
.. method:: create_task(coro, *, name=None, context=None)
342+
.. method:: create_task(coro, *, name=None, context=None, eager_start=None, **kwargs)
334343

335344
Create a task in this task group.
336345
The signature matches that of :func:`asyncio.create_task`.
@@ -342,6 +351,10 @@ and reliable way to wait for all tasks in the group to finish.
342351

343352
Close the given coroutine if the task group is not active.
344353

354+
.. versionchanged:: 3.14
355+
356+
Passes on all *kwargs* to :meth:`loop.create_task`
357+
345358
Example::
346359

347360
async def main():

Doc/library/compression.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
The :mod:`!compression` package
2+
===============================
3+
4+
.. versionadded:: 3.14
5+
6+
The :mod:`!compression` package contains the canonical compression modules
7+
containing interfaces to several different compression algorithms. Some of
8+
these modules have historically been available as separate modules; those will
9+
continue to be available under their original names for compatibility reasons,
10+
and will not be removed without a deprecation cycle. The use of modules in
11+
:mod:`!compression` is encouraged where practical.
12+
13+
* :mod:`!compression.bz2` -- Re-exports :mod:`bz2`
14+
* :mod:`!compression.gzip` -- Re-exports :mod:`gzip`
15+
* :mod:`!compression.lzma` -- Re-exports :mod:`lzma`
16+
* :mod:`!compression.zlib` -- Re-exports :mod:`zlib`
17+
* :mod:`compression.zstd` -- Wrapper for the Zstandard compression library
18+

0 commit comments

Comments
 (0)