]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-91081: Add note on WeakKeyDictionary behavior when deleting a replaced entry ...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 21 Dec 2022 03:34:17 +0000 (19:34 -0800)
committerGitHub <noreply@github.com>
Wed, 21 Dec 2022 03:34:17 +0000 (19:34 -0800)
(cherry picked from commit c615286e8576f2555d4380f38a966c300805b1a5)

Co-authored-by: Stanley <46876382+slateny@users.noreply.github.com>
Co-authored-by: Pieter Eendebak <P.T.eendebak@tudelft.nl>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Doc/library/weakref.rst

index 73e7b21ae405d23b49055b46e1327e5f73a28552..1406b663c6a8e291df1073b17668f918fa35fddd 100644 (file)
@@ -172,6 +172,30 @@ See :ref:`__slots__ documentation <slots>` for details.
    application without adding attributes to those objects.  This can be especially
    useful with objects that override attribute accesses.
 
+   Note that when a key with equal value to an existing key (but not equal identity)
+   is inserted into the dictionary, it replaces the value but does not replace the
+   existing key. Due to this, when the reference to the original key is deleted, it
+   also deletes the entry in the dictionary::
+
+      >>> class T(str): pass
+      ...
+      >>> k1, k2 = T(), T()
+      >>> d = weakref.WeakKeyDictionary()
+      >>> d[k1] = 1   # d = {k1: 1}
+      >>> d[k2] = 2   # d = {k1: 2}
+      >>> del k1      # d = {}
+
+   A workaround would be to remove the key prior to reassignment::
+
+      >>> class T(str): pass
+      ...
+      >>> k1, k2 = T(), T()
+      >>> d = weakref.WeakKeyDictionary()
+      >>> d[k1] = 1   # d = {k1: 1}
+      >>> del d[k1]
+      >>> d[k2] = 2   # d = {k2: 2}
+      >>> del k1      # d = {k2: 2}
+
    .. versionchanged:: 3.9
       Added support for ``|`` and ``|=`` operators, specified in :pep:`584`.