Skip to content

Commit 498e98b

Browse files
committed
Merge remote-tracking branch 'upstream/main' into linenos
2 parents c7764ce + e500cc0 commit 498e98b

File tree

92 files changed

+2685
-666
lines changed

Some content is hidden

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

92 files changed

+2685
-666
lines changed

Doc/c-api/dict.rst

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,54 @@ Dictionary Objects
238238
for key, value in seq2:
239239
if override or key not in a:
240240
a[key] = value
241+
242+
.. c:function:: int PyDict_AddWatcher(PyDict_WatchCallback callback)
243+
244+
Register *callback* as a dictionary watcher. Return a non-negative integer
245+
id which must be passed to future calls to :c:func:`PyDict_Watch`. In case
246+
of error (e.g. no more watcher IDs available), return ``-1`` and set an
247+
exception.
248+
249+
.. c:function:: int PyDict_ClearWatcher(int watcher_id)
250+
251+
Clear watcher identified by *watcher_id* previously returned from
252+
:c:func:`PyDict_AddWatcher`. Return ``0`` on success, ``-1`` on error (e.g.
253+
if the given *watcher_id* was never registered.)
254+
255+
.. c:function:: int PyDict_Watch(int watcher_id, PyObject *dict)
256+
257+
Mark dictionary *dict* as watched. The callback granted *watcher_id* by
258+
:c:func:`PyDict_AddWatcher` will be called when *dict* is modified or
259+
deallocated.
260+
261+
.. c:type:: PyDict_WatchEvent
262+
263+
Enumeration of possible dictionary watcher events: ``PyDict_EVENT_ADDED``,
264+
``PyDict_EVENT_MODIFIED``, ``PyDict_EVENT_DELETED``, ``PyDict_EVENT_CLONED``,
265+
``PyDict_EVENT_CLEARED``, or ``PyDict_EVENT_DEALLOCATED``.
266+
267+
.. c:type:: int (*PyDict_WatchCallback)(PyDict_WatchEvent event, PyObject *dict, PyObject *key, PyObject *new_value)
268+
269+
Type of a dict watcher callback function.
270+
271+
If *event* is ``PyDict_EVENT_CLEARED`` or ``PyDict_EVENT_DEALLOCATED``, both
272+
*key* and *new_value* will be ``NULL``. If *event* is ``PyDict_EVENT_ADDED``
273+
or ``PyDict_EVENT_MODIFIED``, *new_value* will be the new value for *key*.
274+
If *event* is ``PyDict_EVENT_DELETED``, *key* is being deleted from the
275+
dictionary and *new_value* will be ``NULL``.
276+
277+
``PyDict_EVENT_CLONED`` occurs when *dict* was previously empty and another
278+
dict is merged into it. To maintain efficiency of this operation, per-key
279+
``PyDict_EVENT_ADDED`` events are not issued in this case; instead a
280+
single ``PyDict_EVENT_CLONED`` is issued, and *key* will be the source
281+
dictionary.
282+
283+
The callback may inspect but must not modify *dict*; doing so could have
284+
unpredictable effects, including infinite recursion.
285+
286+
Callbacks occur before the notified modification to *dict* takes place, so
287+
the prior state of *dict* can be inspected.
288+
289+
If the callback returns with an exception set, it must return ``-1``; this
290+
exception will be printed as an unraisable exception using
291+
:c:func:`PyErr_WriteUnraisable`. Otherwise it should return ``0``.

Doc/c-api/init.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1929,7 +1929,7 @@ is not possible due to its implementation being opaque at build time.
19291929
Free the given *key* allocated by :c:func:`PyThread_tss_alloc`, after
19301930
first calling :c:func:`PyThread_tss_delete` to ensure any associated
19311931
thread locals have been unassigned. This is a no-op if the *key*
1932-
argument is `NULL`.
1932+
argument is ``NULL``.
19331933
19341934
.. note::
19351935
A freed key becomes a dangling pointer. You should reset the key to

Doc/c-api/type.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Type Objects
4040
.. c:function:: unsigned long PyType_GetFlags(PyTypeObject* type)
4141
4242
Return the :c:member:`~PyTypeObject.tp_flags` member of *type*. This function is primarily
43-
meant for use with `Py_LIMITED_API`; the individual flag bits are
43+
meant for use with ``Py_LIMITED_API``; the individual flag bits are
4444
guaranteed to be stable across Python releases, but access to
4545
:c:member:`~PyTypeObject.tp_flags` itself is not part of the limited API.
4646

Doc/faq/design.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Why can't I use an assignment in an expression?
155155

156156
Starting in Python 3.8, you can!
157157

158-
Assignment expressions using the walrus operator `:=` assign a variable in an
158+
Assignment expressions using the walrus operator ``:=`` assign a variable in an
159159
expression::
160160

161161
while chunk := fp.read(200):

Doc/howto/enum.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,7 @@ Enum Classes
11091109
The :class:`EnumType` metaclass is responsible for providing the
11101110
:meth:`__contains__`, :meth:`__dir__`, :meth:`__iter__` and other methods that
11111111
allow one to do things with an :class:`Enum` class that fail on a typical
1112-
class, such as `list(Color)` or `some_enum_var in Color`. :class:`EnumType` is
1112+
class, such as ``list(Color)`` or ``some_enum_var in Color``. :class:`EnumType` is
11131113
responsible for ensuring that various other methods on the final :class:`Enum`
11141114
class are correct (such as :meth:`__new__`, :meth:`__getnewargs__`,
11151115
:meth:`__str__` and :meth:`__repr__`).

Doc/howto/logging-cookbook.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ To run a logging listener in production, you may need to use a process-managemen
562562
such as `Supervisor <http://supervisord.org/>`_. `Here
563563
<https://gist.github.com/vsajip/4b227eeec43817465ca835ca66f75e2b>`_ is a Gist which
564564
provides the bare-bones files to run the above functionality using Supervisor: you
565-
will need to change the `/path/to/` parts in the Gist to reflect the actual paths you
565+
will need to change the ``/path/to/`` parts in the Gist to reflect the actual paths you
566566
want to use.
567567

568568

@@ -2774,7 +2774,7 @@ Formatting times using UTC (GMT) via configuration
27742774
--------------------------------------------------
27752775

27762776
Sometimes you want to format times using UTC, which can be done using a class
2777-
such as `UTCFormatter`, shown below::
2777+
such as ``UTCFormatter``, shown below::
27782778

27792779
import logging
27802780
import time

Doc/howto/logging.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -555,14 +555,14 @@ raw message. If there is no date format string, the default date format is:
555555
556556
%Y-%m-%d %H:%M:%S
557557
558-
with the milliseconds tacked on at the end. The ``style`` is one of `%`, '{'
559-
or '$'. If one of these is not specified, then '%' will be used.
558+
with the milliseconds tacked on at the end. The ``style`` is one of ``'%'``,
559+
``'{'``, or ``'$'``. If one of these is not specified, then ``'%'`` will be used.
560560

561-
If the ``style`` is '%', the message format string uses
561+
If the ``style`` is ``'%'``, the message format string uses
562562
``%(<dictionary key>)s`` styled string substitution; the possible keys are
563-
documented in :ref:`logrecord-attributes`. If the style is '{', the message
563+
documented in :ref:`logrecord-attributes`. If the style is ``'{'``, the message
564564
format string is assumed to be compatible with :meth:`str.format` (using
565-
keyword arguments), while if the style is '$' then the message format string
565+
keyword arguments), while if the style is ``'$'`` then the message format string
566566
should conform to what is expected by :meth:`string.Template.substitute`.
567567

568568
.. versionchanged:: 3.2

Doc/howto/perf_profiling.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ Enabling perf profiling mode
151151
----------------------------
152152

153153
There are two main ways to activate the perf profiling mode. If you want it to be
154-
active since the start of the Python interpreter, you can use the `-Xperf` option:
154+
active since the start of the Python interpreter, you can use the ``-Xperf`` option:
155155

156156
$ python -Xperf my_script.py
157157

Doc/install/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ And on Windows, the configuration files are:
765765
+--------------+-------------------------------------------------+-------+
766766

767767
On all platforms, the "personal" file can be temporarily disabled by
768-
passing the `--no-user-cfg` option.
768+
passing the ``--no-user-cfg`` option.
769769

770770
Notes:
771771

Doc/library/asyncio-future.rst

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,6 @@ Future Object
197197
.. versionchanged:: 3.9
198198
Added the *msg* parameter.
199199

200-
.. deprecated-removed:: 3.11 3.14
201-
*msg* parameter is ambiguous when multiple :meth:`cancel`
202-
are called with different cancellation messages.
203-
The argument will be removed.
204-
205200
.. method:: exception()
206201

207202
Return the exception that was set on this Future.
@@ -282,8 +277,3 @@ the Future has a result::
282277

283278
- :meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument,
284279
but :func:`concurrent.futures.cancel` does not.
285-
286-
.. deprecated-removed:: 3.11 3.14
287-
*msg* parameter is ambiguous when multiple :meth:`cancel`
288-
are called with different cancellation messages.
289-
The argument will be removed.

0 commit comments

Comments
 (0)