]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-96397: Document that attributes need not be identifiers (#96454)
authorJeff Allen <ja.py@farowl.co.uk>
Thu, 29 Sep 2022 23:02:27 +0000 (00:02 +0100)
committerGitHub <noreply@github.com>
Thu, 29 Sep 2022 23:02:27 +0000 (16:02 -0700)
Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM>
Doc/glossary.rst
Doc/library/functions.rst

index e0dd4fc96760e76a219a7da013588b074a4d1cc4..9385b8ddd13d1047e60f8086bbb7e2b00bb269bd 100644 (file)
@@ -136,10 +136,17 @@ Glossary
       :exc:`StopAsyncIteration` exception.  Introduced by :pep:`492`.
 
    attribute
-      A value associated with an object which is referenced by name using
-      dotted expressions.  For example, if an object *o* has an attribute
+      A value associated with an object which is usually referenced by name
+      using dotted expressions.
+      For example, if an object *o* has an attribute
       *a* it would be referenced as *o.a*.
 
+      It is possible to give an object an attribute whose name is not an
+      identifier as defined by :ref:`identifiers`, for example using
+      :func:`setattr`, if the object allows it.
+      Such an attribute will not be accessible using a dotted expression,
+      and would instead need to be retrieved with :func:`getattr`.
+
    awaitable
       An object that can be used in an :keyword:`await` expression.  Can be
       a :term:`coroutine` or an object with an :meth:`__await__` method.
index ccb691dd9f009f4a59e1260934c1ba8423a54cb8..26ee302d2eabc35b80d8cc765deb9e4a423468c2 100644 (file)
@@ -397,6 +397,7 @@ are always available.  They are listed here in alphabetical order.
    string.  The string must be the name of one of the object's attributes.  The
    function deletes the named attribute, provided the object allows it.  For
    example, ``delattr(x, 'foobar')`` is equivalent to ``del x.foobar``.
+   *name* need not be a Python identifier (see :func:`setattr`).
 
 
 .. _func-dict:
@@ -738,6 +739,7 @@ are always available.  They are listed here in alphabetical order.
    value of that attribute.  For example, ``getattr(x, 'foobar')`` is equivalent to
    ``x.foobar``.  If the named attribute does not exist, *default* is returned if
    provided, otherwise :exc:`AttributeError` is raised.
+   *name* need not be a Python identifier (see :func:`setattr`).
 
    .. note::
 
@@ -1582,6 +1584,12 @@ are always available.  They are listed here in alphabetical order.
    object allows it.  For example, ``setattr(x, 'foobar', 123)`` is equivalent to
    ``x.foobar = 123``.
 
+   *name* need not be a Python identifier as defined in :ref:`identifiers`
+   unless the object chooses to enforce that, for example in a custom
+   :meth:`~object.__getattribute__` or via :attr:`~object.__slots__`.
+   An attribute whose name is not an identifier will not be accessible using
+   the dot notation, but is accessible through :func:`getattr` etc..
+
    .. note::
 
       Since :ref:`private name mangling <private-name-mangling>` happens at