[3.13] gh-120452: improve documentation about private name mangling (GH-120451) (#121715)

gh-120452: improve documentation about private name mangling (GH-120451)
(cherry picked from commit f4d6e45c1e)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-07-13 17:21:30 +02:00 committed by GitHub
parent b9cfb812e2
commit 4af9c05e78
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 69 additions and 15 deletions

View file

@ -83,18 +83,47 @@ exception.
pair: name; mangling
pair: private; names
**Private name mangling:** When an identifier that textually occurs in a class
definition begins with two or more underscore characters and does not end in two
or more underscores, it is considered a :dfn:`private name` of that class.
Private names are transformed to a longer form before code is generated for
them. The transformation inserts the class name, with leading underscores
removed and a single underscore inserted, in front of the name. For example,
the identifier ``__spam`` occurring in a class named ``Ham`` will be transformed
to ``_Ham__spam``. This transformation is independent of the syntactical
context in which the identifier is used. If the transformed name is extremely
long (longer than 255 characters), implementation defined truncation may happen.
If the class name consists only of underscores, no transformation is done.
Private name mangling
^^^^^^^^^^^^^^^^^^^^^
When an identifier that textually occurs in a class definition begins with two
or more underscore characters and does not end in two or more underscores, it
is considered a :dfn:`private name` of that class.
.. seealso::
The :ref:`class specifications <class>`.
More precisely, private names are transformed to a longer form before code is
generated for them. If the transformed name is longer than 255 characters,
implementation-defined truncation may happen.
The transformation is independent of the syntactical context in which the
identifier is used but only the following private identifiers are mangled:
- Any name used as the name of a variable that is assigned or read or any
name of an attribute being accessed.
The ``__name__`` attribute of nested functions, classes, and type aliases
is however not mangled.
- The name of imported modules, e.g., ``__spam`` in ``import __spam``.
If the module is part of a package (i.e., its name contains a dot),
the name is *not* mangled, e.g., the ``__foo`` in ``import __foo.bar``
is not mangled.
- The name of an imported member, e.g., ``__f`` in ``from spam import __f``.
The transformation rule is defined as follows:
- The class name, with leading underscores removed and a single leading
underscore inserted, is inserted in front of the identifier, e.g., the
identifier ``__spam`` occurring in a class named ``Foo``, ``_Foo`` or
``__Foo`` is transformed to ``_Foo__spam``.
- If the class name consists only of underscores, the transformation is the
identity, e.g., the identifier ``__spam`` occurring in a class named ``_``
or ``__`` is left as is.
.. _atom-literals: