mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
GH-91052: Add C API for watching dictionaries (GH-31787)
This commit is contained in:
parent
683ab85955
commit
a4b7794887
10 changed files with 487 additions and 17 deletions
|
|
@ -238,3 +238,54 @@ Dictionary Objects
|
|||
for key, value in seq2:
|
||||
if override or key not in a:
|
||||
a[key] = value
|
||||
|
||||
.. c:function:: int PyDict_AddWatcher(PyDict_WatchCallback callback)
|
||||
|
||||
Register *callback* as a dictionary watcher. Return a non-negative integer
|
||||
id which must be passed to future calls to :c:func:`PyDict_Watch`. In case
|
||||
of error (e.g. no more watcher IDs available), return ``-1`` and set an
|
||||
exception.
|
||||
|
||||
.. c:function:: int PyDict_ClearWatcher(int watcher_id)
|
||||
|
||||
Clear watcher identified by *watcher_id* previously returned from
|
||||
:c:func:`PyDict_AddWatcher`. Return ``0`` on success, ``-1`` on error (e.g.
|
||||
if the given *watcher_id* was never registered.)
|
||||
|
||||
.. c:function:: int PyDict_Watch(int watcher_id, PyObject *dict)
|
||||
|
||||
Mark dictionary *dict* as watched. The callback granted *watcher_id* by
|
||||
:c:func:`PyDict_AddWatcher` will be called when *dict* is modified or
|
||||
deallocated.
|
||||
|
||||
.. c:type:: PyDict_WatchEvent
|
||||
|
||||
Enumeration of possible dictionary watcher events: ``PyDict_EVENT_ADDED``,
|
||||
``PyDict_EVENT_MODIFIED``, ``PyDict_EVENT_DELETED``, ``PyDict_EVENT_CLONED``,
|
||||
``PyDict_EVENT_CLEARED``, or ``PyDict_EVENT_DEALLOCATED``.
|
||||
|
||||
.. c:type:: int (*PyDict_WatchCallback)(PyDict_WatchEvent event, PyObject *dict, PyObject *key, PyObject *new_value)
|
||||
|
||||
Type of a dict watcher callback function.
|
||||
|
||||
If *event* is ``PyDict_EVENT_CLEARED`` or ``PyDict_EVENT_DEALLOCATED``, both
|
||||
*key* and *new_value* will be ``NULL``. If *event* is ``PyDict_EVENT_ADDED``
|
||||
or ``PyDict_EVENT_MODIFIED``, *new_value* will be the new value for *key*.
|
||||
If *event* is ``PyDict_EVENT_DELETED``, *key* is being deleted from the
|
||||
dictionary and *new_value* will be ``NULL``.
|
||||
|
||||
``PyDict_EVENT_CLONED`` occurs when *dict* was previously empty and another
|
||||
dict is merged into it. To maintain efficiency of this operation, per-key
|
||||
``PyDict_EVENT_ADDED`` events are not issued in this case; instead a
|
||||
single ``PyDict_EVENT_CLONED`` is issued, and *key* will be the source
|
||||
dictionary.
|
||||
|
||||
The callback may inspect but must not modify *dict*; doing so could have
|
||||
unpredictable effects, including infinite recursion.
|
||||
|
||||
Callbacks occur before the notified modification to *dict* takes place, so
|
||||
the prior state of *dict* can be inspected.
|
||||
|
||||
If the callback returns with an exception set, it must return ``-1``; this
|
||||
exception will be printed as an unraisable exception using
|
||||
:c:func:`PyErr_WriteUnraisable`. Otherwise it should return ``0``.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue