
.. _datamodel:

**********
Data model
**********


.. _objects:

Objects, values and types
=========================

.. index::
   single: object
   single: data

:dfn:`Objects` are Python's abstraction for data.  All data in a Python program
is represented by objects or by relations between objects. (In a sense, and in
conformance to Von Neumann's model of a "stored program computer", code is also
represented by objects.)

.. index::
   pair: built-in function; id
   pair: built-in function; type
   single: identity of an object
   single: value of an object
   single: type of an object
   single: mutable object
   single: immutable object

.. XXX it *is* now possible in some cases to change an object's
   type, under certain controlled conditions

Every object has an identity, a type and a value.  An object's *identity* never
changes once it has been created; you may think of it as the object's address in
memory.  The :keyword:`is` operator compares the identity of two objects; the
:func:`id` function returns an integer representing its identity.

.. impl-detail::

   For CPython, ``id(x)`` is the memory address where ``x`` is stored.

An object's type determines the operations that the object supports (e.g., "does
it have a length?") and also defines the possible values for objects of that
type.  The :func:`type` function returns an object's type (which is an object
itself).  Like its identity, an object's :dfn:`type` is also unchangeable.
[#]_

The *value* of some objects can change.  Objects whose value can
change are said to be *mutable*; objects whose value is unchangeable once they
are created are called *immutable*. (The value of an immutable container object
that contains a reference to a mutable object can change when the latter's value
is changed; however the container is still considered immutable, because the
collection of objects it contains cannot be changed.  So, immutability is not
strictly the same as having an unchangeable value, it is more subtle.) An
object's mutability is determined by its type; for instance, numbers, strings
and tuples are immutable, while dictionaries and lists are mutable.

.. index::
   single: garbage collection
   single: reference counting
   single: unreachable object

Objects are never explicitly destroyed; however, when they become unreachable
they may be garbage-collected.  An implementation is allowed to postpone garbage
collection or omit it altogether --- it is a matter of implementation quality
how garbage collection is implemented, as long as no objects are collected that
are still reachable.

.. impl-detail::

   CPython currently uses a reference-counting scheme with (optional) delayed
   detection of cyclically linked garbage, which collects most objects as soon
   as they become unreachable, but is not guaranteed to collect garbage
   containing circular references.  See the documentation of the :mod:`gc`
   module for information on controlling the collection of cyclic garbage.
   Other implementations act differently and CPython may change.
   Do not depend on immediate finalization of objects when they become
   unreachable (so you should always close files explicitly).

Note that the use of the implementation's tracing or debugging facilities may
keep objects alive that would normally be collectable. Also note that catching
an exception with a :keyword:`try`...\ :keyword:`except` statement may keep
objects alive.

Some objects contain references to "external" resources such as open files or
windows.  It is understood that these resources are freed when the object is
garbage-collected, but since garbage collection is not guaranteed to happen,
such objects also provide an explicit way to release the external resource,
usually a :meth:`!close` method. Programs are strongly recommended to explicitly
close such objects.  The :keyword:`try`...\ :keyword:`finally` statement
and the :keyword:`with` statement provide convenient ways to do this.

.. index:: single: container

Some objects contain references to other objects; these are called *containers*.
Examples of containers are tuples, lists and dictionaries.  The references are
part of a container's value.  In most cases, when we talk about the value of a
container, we imply the values, not the identities of the contained objects;
however, when we talk about the mutability of a container, only the identities
of the immediately contained objects are implied.  So, if an immutable container
(like a tuple) contains a reference to a mutable object, its value changes if
that mutable object is changed.

Types affect almost all aspects of object behavior.  Even the importance of
object identity is affected in some sense: for immutable types, operations that
compute new values may actually return a reference to any existing object with
the same type and value, while for mutable objects this is not allowed.
For example, after ``a = 1; b = 1``, *a* and *b* may or may not refer to
the same object with the value one, depending on the implementation.
This is because :class:`int` is an immutable type, so the reference to ``1``
can be reused. This behaviour depends on the implementation used, so should
not be relied upon, but is something to be aware of when making use of object
identity tests.
However, after ``c = []; d = []``, *c* and *d* are guaranteed to refer to two
different, unique, newly created empty lists. (Note that ``e = f = []`` assigns
the *same* object to both *e* and *f*.)


.. _types:

The standard type hierarchy
===========================

.. index::
   single: type
   pair: data; type
   pair: type; hierarchy
   pair: extension; module
   pair: C; language

Below is a list of the types that are built into Python.  Extension modules
(written in C, Java, or other languages, depending on the implementation) can
define additional types.  Future versions of Python may add types to the type
hierarchy (e.g., rational numbers, efficiently stored arrays of integers, etc.),
although such additions will often be provided via the standard library instead.

.. index::
   single: attribute
   pair: special; attribute
   triple: generic; special; attribute

Some of the type descriptions below contain a paragraph listing 'special
attributes.'  These are attributes that provide access to the implementation and
are not intended for general use.  Their definition may change in the future.


None
----

.. index:: pair: object; None

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name ``None``. It is used to signify the
absence of a value in many situations, e.g., it is returned from functions that
don't explicitly return anything. Its truth value is false.


NotImplemented
--------------

.. index:: pair: object; NotImplemented

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name :data:`NotImplemented`. Numeric methods
and rich comparison methods should return this value if they do not implement the
operation for the operands provided.  (The interpreter will then try the
reflected operation, or some other fallback, depending on the operator.)  It
should not be evaluated in a boolean context.

See
:ref:`implementing-the-arithmetic-operations`
for more details.

.. versionchanged:: 3.9
   Evaluating :data:`NotImplemented` in a boolean context was deprecated.

.. versionchanged:: 3.14
   Evaluating :data:`NotImplemented` in a boolean context now raises a :exc:`TypeError`.
   It previously evaluated to :const:`True` and emitted a :exc:`DeprecationWarning`
   since Python 3.9.


Ellipsis
--------
.. index::
   pair: object; Ellipsis
   single: ...; ellipsis literal

This type has a single value.  There is a single object with this value. This
object is accessed through the literal ``...`` or the built-in name
``Ellipsis``.  Its truth value is true.


:class:`numbers.Number`
-----------------------

.. index:: pair: object; numeric

These are created by numeric literals and returned as results by arithmetic
operators and arithmetic built-in functions.  Numeric objects are immutable;
once created their value never changes.  Python numbers are of course strongly
related to mathematical numbers, but subject to the limitations of numerical
representation in computers.

The string representations of the numeric classes, computed by
:meth:`~object.__repr__` and :meth:`~object.__str__`, have the following
properties:

* They are valid numeric literals which, when passed to their
  class constructor, produce an object having the value of the
  original numeric.

* The representation is in base 10, when possible.

* Leading zeros, possibly excepting a single zero before a
  decimal point, are not shown.

* Trailing zeros, possibly excepting a single zero after a
  decimal point, are not shown.

* A sign is shown only when the number is negative.

Python distinguishes between integers, floating-point numbers, and complex
numbers:


:class:`numbers.Integral`
^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: pair: object; integer

These represent elements from the mathematical set of integers (positive and
negative).

.. note::
   .. index:: pair: integer; representation

   The rules for integer representation are intended to give the most meaningful
   interpretation of shift and mask operations involving negative integers.

There are two types of integers:

Integers (:class:`int`)
   These represent numbers in an unlimited range, subject to available (virtual)
   memory only.  For the purpose of shift and mask operations, a binary
   representation is assumed, and negative numbers are represented in a variant of
   2's complement which gives the illusion of an infinite string of sign bits
   extending to the left.

Booleans (:class:`bool`)
   .. index::
      pair: object; Boolean
      single: False
      single: True

   These represent the truth values False and True.  The two objects representing
   the values ``False`` and ``True`` are the only Boolean objects. The Boolean type is a
   subtype of the integer type, and Boolean values behave like the values 0 and 1,
   respectively, in almost all contexts, the exception being that when converted to
   a string, the strings ``"False"`` or ``"True"`` are returned, respectively.


:class:`numbers.Real` (:class:`float`)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; floating-point
   pair: floating-point; number
   pair: C; language
   pair: Java; language

These represent machine-level double precision floating-point numbers. You are
at the mercy of the underlying machine architecture (and C or Java
implementation) for the accepted range and handling of overflow. Python does not
support single-precision floating-point numbers; the savings in processor and
memory usage that are usually the reason for using these are dwarfed by the
overhead of using objects in Python, so there is no reason to complicate the
language with two kinds of floating-point numbers.


:class:`numbers.Complex` (:class:`complex`)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; complex
   pair: complex; number

These represent complex numbers as a pair of machine-level double precision
floating-point numbers.  The same caveats apply as for floating-point numbers.
The real and imaginary parts of a complex number ``z`` can be retrieved through
the read-only attributes ``z.real`` and ``z.imag``.


Sequences
---------

.. index::
   pair: built-in function; len
   pair: object; sequence
   single: index operation
   single: item selection
   single: subscription

These represent finite ordered sets indexed by non-negative numbers. The
built-in function :func:`len` returns the number of items of a sequence. When
the length of a sequence is *n*, the index set contains the numbers 0, 1,
..., *n*-1.  Item *i* of sequence *a* is selected by ``a[i]``. Some sequences,
including built-in sequences, interpret negative subscripts by adding the
sequence length. For example, ``a[-2]`` equals ``a[n-2]``, the second to last
item of sequence a with length ``n``.

.. index:: single: slicing

Sequences also support slicing: ``a[i:j]`` selects all items with index *k* such
that *i* ``<=`` *k* ``<`` *j*.  When used as an expression, a slice is a
sequence of the same type. The comment above about negative indexes also applies
to negative slice positions.

Some sequences also support "extended slicing" with a third "step" parameter:
``a[i:j:k]`` selects all items of *a* with index *x* where ``x = i + n*k``, *n*
``>=`` ``0`` and *i* ``<=`` *x* ``<`` *j*.

Sequences are distinguished according to their mutability:


Immutable sequences
^^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; immutable sequence
   pair: object; immutable

An object of an immutable sequence type cannot change once it is created.  (If
the object contains references to other objects, these other objects may be
mutable and may be changed; however, the collection of objects directly
referenced by an immutable object cannot change.)

The following types are immutable sequences:

.. index::
   single: string; immutable sequences

Strings
   .. index::
      pair: built-in function; chr
      pair: built-in function; ord
      single: character
      single: integer
      single: Unicode

   A string is a sequence of values that represent Unicode code points.
   All the code points in the range ``U+0000 - U+10FFFF`` can be
   represented in a string.  Python doesn't have a :c:expr:`char` type;
   instead, every code point in the string is represented as a string
   object with length ``1``.  The built-in function :func:`ord`
   converts a code point from its string form to an integer in the
   range ``0 - 10FFFF``; :func:`chr` converts an integer in the range
   ``0 - 10FFFF`` to the corresponding length ``1`` string object.
   :meth:`str.encode` can be used to convert a :class:`str` to
   :class:`bytes` using the given text encoding, and
   :meth:`bytes.decode` can be used to achieve the opposite.

Tuples
   .. index::
      pair: object; tuple
      pair: singleton; tuple
      pair: empty; tuple

   The items of a tuple are arbitrary Python objects. Tuples of two or
   more items are formed by comma-separated lists of expressions.  A tuple
   of one item (a 'singleton') can be formed by affixing a comma to an
   expression (an expression by itself does not create a tuple, since
   parentheses must be usable for grouping of expressions).  An empty
   tuple can be formed by an empty pair of parentheses.

Bytes
   .. index:: bytes, byte

   A bytes object is an immutable array.  The items are 8-bit bytes,
   represented by integers in the range 0 <= x < 256.  Bytes literals
   (like ``b'abc'``) and the built-in :func:`bytes` constructor
   can be used to create bytes objects.  Also, bytes objects can be
   decoded to strings via the :meth:`~bytes.decode` method.


Mutable sequences
^^^^^^^^^^^^^^^^^

.. index::
   pair: object; mutable sequence
   pair: object; mutable
   pair: assignment; statement
   single: subscription
   single: slicing

Mutable sequences can be changed after they are created.  The subscription and
slicing notations can be used as the target of assignment and :keyword:`del`
(delete) statements.

.. note::
   .. index:: pair: module; array
   .. index:: pair: module; collections

   The :mod:`collections` and :mod:`array` module provide
   additional examples of mutable sequence types.

There are currently two intrinsic mutable sequence types:

Lists
   .. index:: pair: object; list

   The items of a list are arbitrary Python objects.  Lists are formed by
   placing a comma-separated list of expressions in square brackets. (Note
   that there are no special cases needed to form lists of length 0 or 1.)

Byte Arrays
   .. index:: bytearray

   A bytearray object is a mutable array. They are created by the built-in
   :func:`bytearray` constructor.  Aside from being mutable
   (and hence unhashable), byte arrays otherwise provide the same interface
   and functionality as immutable :class:`bytes` objects.


Set types
---------

.. index::
   pair: built-in function; len
   pair: object; set type

These represent unordered, finite sets of unique, immutable objects. As such,
they cannot be indexed by any subscript. However, they can be iterated over, and
the built-in function :func:`len` returns the number of items in a set. Common
uses for sets are fast membership testing, removing duplicates from a sequence,
and computing mathematical operations such as intersection, union, difference,
and symmetric difference.

For set elements, the same immutability rules apply as for dictionary keys. Note
that numeric types obey the normal rules for numeric comparison: if two numbers
compare equal (e.g., ``1`` and ``1.0``), only one of them can be contained in a
set.

There are currently two intrinsic set types:


Sets
   .. index:: pair: object; set

   These represent a mutable set. They are created by the built-in :func:`set`
   constructor and can be modified afterwards by several methods, such as
   :meth:`~set.add`.


Frozen sets
   .. index:: pair: object; frozenset

   These represent an immutable set.  They are created by the built-in
   :func:`frozenset` constructor.  As a frozenset is immutable and
   :term:`hashable`, it can be used again as an element of another set, or as
   a dictionary key.


Mappings
--------

.. index::
   pair: built-in function; len
   single: subscription
   pair: object; mapping

These represent finite sets of objects indexed by arbitrary index sets. The
subscript notation ``a[k]`` selects the item indexed by ``k`` from the mapping
``a``; this can be used in expressions and as the target of assignments or
:keyword:`del` statements. The built-in function :func:`len` returns the number
of items in a mapping.

There is currently a single intrinsic mapping type:


Dictionaries
^^^^^^^^^^^^

.. index:: pair: object; dictionary

These represent finite sets of objects indexed by nearly arbitrary values.  The
only types of values not acceptable as keys are values containing lists or
dictionaries or other mutable types that are compared by value rather than by
object identity, the reason being that the efficient implementation of
dictionaries requires a key's hash value to remain constant. Numeric types used
for keys obey the normal rules for numeric comparison: if two numbers compare
equal (e.g., ``1`` and ``1.0``) then they can be used interchangeably to index
the same dictionary entry.

Dictionaries preserve insertion order, meaning that keys will be produced
in the same order they were added sequentially over the dictionary.
Replacing an existing key does not change the order, however removing a key
and re-inserting it will add it to the end instead of keeping its old place.

Dictionaries are mutable; they can be created by the ``{}`` notation (see
section :ref:`dict`).

.. index::
   pair: module; dbm.ndbm
   pair: module; dbm.gnu

The extension modules :mod:`dbm.ndbm` and :mod:`dbm.gnu` provide
additional examples of mapping types, as does the :mod:`collections`
module.

.. versionchanged:: 3.7
   Dictionaries did not preserve insertion order in versions of Python before 3.6.
   In CPython 3.6, insertion order was preserved, but it was considered
   an implementation detail at that time rather than a language guarantee.


Callable types
--------------

.. index::
   pair: object; callable
   pair: function; call
   single: invocation
   pair: function; argument

These are the types to which the function call operation (see section
:ref:`calls`) can be applied:


.. _user-defined-funcs:

User-defined functions
^^^^^^^^^^^^^^^^^^^^^^

.. index::
   pair: user-defined; function
   pair: object; function
   pair: object; user-defined function

A user-defined function object is created by a function definition (see
section :ref:`function`).  It should be called with an argument list
containing the same number of items as the function's formal parameter
list.

Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. index::
   single: __closure__ (function attribute)
   single: __globals__ (function attribute)
   pair: global; namespace

.. list-table::
   :header-rows: 1

   * - Attribute
     - Meaning

   * - .. attribute:: function.__globals__
     - A reference to the :class:`dictionary <dict>` that holds the function's
       :ref:`global variables <naming>` -- the global namespace of the module
       in which the function was defined.

   * - .. attribute:: function.__closure__
     - ``None`` or a :class:`tuple` of cells that contain bindings for the names specified
       in the :attr:`~codeobject.co_freevars` attribute of the function's
       :attr:`code object <function.__code__>`.

       A cell object has the attribute ``cell_contents``.
       This can be used to get the value of the cell, as well as set the value.

Special writable attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. index::
   single: __doc__ (function attribute)
   single: __name__ (function attribute)
   single: __module__ (function attribute)
   single: __dict__ (function attribute)
   single: __defaults__ (function attribute)
   single: __code__ (function attribute)
   single: __annotations__ (function attribute)
   single: __annotate__ (function attribute)
   single: __kwdefaults__ (function attribute)
   single: __type_params__ (function attribute)

Most of these attributes check the type of the assigned value:

.. list-table::
   :header-rows: 1

   * - Attribute
     - Meaning

   * - .. attribute:: function.__doc__
     - The function's documentation string, or ``None`` if unavailable.

   * - .. attribute:: function.__name__
     - The function's name.
       See also: :attr:`__name__ attributes <definition.__name__>`.

   * - .. attribute:: function.__qualname__
     - The function's :term:`qualified name`.
       See also: :attr:`__qualname__ attributes <definition.__qualname__>`.

       .. versionadded:: 3.3

   * - .. attribute:: function.__module__
     - The name of the module the function was defined in,
       or ``None`` if unavailable.

   * - .. attribute:: function.__defaults__
     - A :class:`tuple` containing default :term:`parameter` values
       for those parameters that have defaults,
       or ``None`` if no parameters have a default value.

   * - .. attribute:: function.__code__
     - The :ref:`code object <code-objects>` representing
       the compiled function body.

   * - .. attribute:: function.__dict__
     - The namespace supporting arbitrary function attributes.
       See also: :attr:`__dict__ attributes <object.__dict__>`.

   * - .. attribute:: function.__annotations__
     - A :class:`dictionary <dict>` containing annotations of
       :term:`parameters <parameter>`.
       The keys of the dictionary are the parameter names,
       and ``'return'`` for the return annotation, if provided.
       See also: :attr:`object.__annotations__`.

       .. versionchanged:: 3.14
          Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
          See :pep:`649`.

   * - .. attribute:: function.__annotate__
     - The :term:`annotate function` for this function, or ``None``
       if the function has no annotations. See :attr:`object.__annotate__`.

       .. versionadded:: 3.14

   * - .. attribute:: function.__kwdefaults__
     - A :class:`dictionary <dict>` containing defaults for keyword-only
       :term:`parameters <parameter>`.

   * - .. attribute:: function.__type_params__
     - A :class:`tuple` containing the :ref:`type parameters <type-params>` of
       a :ref:`generic function <generic-functions>`.

       .. versionadded:: 3.12

Function objects also support getting and setting arbitrary attributes, which
can be used, for example, to attach metadata to functions.  Regular attribute
dot-notation is used to get and set such attributes.

.. impl-detail::

   CPython's current implementation only supports function attributes
   on user-defined functions. Function attributes on
   :ref:`built-in functions <builtin-functions>` may be supported in the
   future.

Additional information about a function's definition can be retrieved from its
:ref:`code object <code-objects>`
(accessible via the :attr:`~function.__code__` attribute).


.. _instance-methods:

Instance methods
^^^^^^^^^^^^^^^^

.. index::
   pair: object; method
   pair: object; user-defined method
   pair: user-defined; method

An instance method object combines a class, a class instance and any
callable object (normally a user-defined function).

.. index::
   single: __func__ (method attribute)
   single: __self__ (method attribute)
   single: __doc__ (method attribute)
   single: __name__ (method attribute)
   single: __module__ (method attribute)

Special read-only attributes:

.. list-table::

   * - .. attribute:: method.__self__
     - Refers to the class instance object to which the method is
       :ref:`bound <method-binding>`

   * - .. attribute:: method.__func__
     - Refers to the original :ref:`function object <user-defined-funcs>`

   * - .. attribute:: method.__doc__
     - The method's documentation
       (same as :attr:`method.__func__.__doc__ <function.__doc__>`).
       A :class:`string <str>` if the original function had a docstring, else
       ``None``.

   * - .. attribute:: method.__name__
     - The name of the method
       (same as :attr:`method.__func__.__name__ <function.__name__>`)

   * - .. attribute:: method.__module__
     - The name of the module the method was defined in, or ``None`` if
       unavailable.

Methods also support accessing (but not setting) the arbitrary function
attributes on the underlying :ref:`function object <user-defined-funcs>`.

User-defined method objects may be created when getting an attribute of a
class (perhaps via an instance of that class), if that attribute is a
user-defined :ref:`function object <user-defined-funcs>` or a
:class:`classmethod` object.

.. _method-binding:

When an instance method object is created by retrieving a user-defined
:ref:`function object <user-defined-funcs>` from a class via one of its
instances, its :attr:`~method.__self__` attribute is the instance, and the
method object is said to be *bound*.  The new method's :attr:`~method.__func__`
attribute is the original function object.

When an instance method object is created by retrieving a :class:`classmethod`
object from a class or instance, its :attr:`~method.__self__` attribute is the
class itself, and its :attr:`~method.__func__` attribute is the function object
underlying the class method.

When an instance method object is called, the underlying function
(:attr:`~method.__func__`) is called, inserting the class instance
(:attr:`~method.__self__`) in front of the argument list.  For instance, when
:class:`!C` is a class which contains a definition for a function
:meth:`!f`, and ``x`` is an instance of :class:`!C`, calling ``x.f(1)`` is
equivalent to calling ``C.f(x, 1)``.

When an instance method object is derived from a :class:`classmethod` object, the
"class instance" stored in :attr:`~method.__self__` will actually be the class
itself, so that calling either ``x.f(1)`` or ``C.f(1)`` is equivalent to
calling ``f(C,1)`` where ``f`` is the underlying function.

It is important to note that user-defined functions
which are attributes of a class instance are not converted to bound
methods; this *only* happens when the function is an attribute of the
class.


Generator functions
^^^^^^^^^^^^^^^^^^^

.. index::
   single: generator; function
   single: generator; iterator

A function or method which uses the :keyword:`yield` statement (see section
:ref:`yield`) is called a :dfn:`generator function`.  Such a function, when
called, always returns an :term:`iterator` object which can be used to
execute the body of the function:  calling the iterator's
:meth:`iterator.__next__` method will cause the function to execute until
it provides a value using the :keyword:`!yield` statement.  When the
function executes a :keyword:`return` statement or falls off the end, a
:exc:`StopIteration` exception is raised and the iterator will have
reached the end of the set of values to be returned.


Coroutine functions
^^^^^^^^^^^^^^^^^^^

.. index::
   single: coroutine; function

A function or method which is defined using :keyword:`async def` is called
a :dfn:`coroutine function`.  Such a function, when called, returns a
:term:`coroutine` object.  It may contain :keyword:`await` expressions,
as well as :keyword:`async with` and :keyword:`async for` statements. See
also the :ref:`coroutine-objects` section.


Asynchronous generator functions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   single: asynchronous generator; function
   single: asynchronous generator; asynchronous iterator

A function or method which is defined using :keyword:`async def` and
which uses the :keyword:`yield` statement is called a
:dfn:`asynchronous generator function`.  Such a function, when called,
returns an :term:`asynchronous iterator` object which can be used in an
:keyword:`async for` statement to execute the body of the function.

Calling the asynchronous iterator's
:meth:`aiterator.__anext__ <object.__anext__>` method
will return an :term:`awaitable` which when awaited
will execute until it provides a value using the :keyword:`yield`
expression.  When the function executes an empty :keyword:`return`
statement or falls off the end, a :exc:`StopAsyncIteration` exception
is raised and the asynchronous iterator will have reached the end of
the set of values to be yielded.


.. _builtin-functions:

Built-in functions
^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; built-in function
   pair: object; function
   pair: C; language

A built-in function object is a wrapper around a C function.  Examples of
built-in functions are :func:`len` and :func:`math.sin` (:mod:`math` is a
standard built-in module). The number and type of the arguments are
determined by the C function. Special read-only attributes:

* :attr:`!__doc__` is the function's documentation string, or ``None`` if
  unavailable. See :attr:`function.__doc__`.
* :attr:`!__name__` is the function's name. See :attr:`function.__name__`.
* :attr:`!__self__` is set to ``None`` (but see the next item).
* :attr:`!__module__` is the name of
  the module the function was defined in or ``None`` if unavailable.
  See :attr:`function.__module__`.


.. _builtin-methods:

Built-in methods
^^^^^^^^^^^^^^^^

.. index::
   pair: object; built-in method
   pair: object; method
   pair: built-in; method

This is really a different disguise of a built-in function, this time containing
an object passed to the C function as an implicit extra argument.  An example of
a built-in method is ``alist.append()``, assuming *alist* is a list object. In
this case, the special read-only attribute :attr:`!__self__` is set to the object
denoted by *alist*. (The attribute has the same semantics as it does with
:attr:`other instance methods <method.__self__>`.)

.. _classes:

Classes
^^^^^^^

Classes are callable.  These objects normally act as factories for new
instances of themselves, but variations are possible for class types that
override :meth:`~object.__new__`.  The arguments of the call are passed to
:meth:`!__new__` and, in the typical case, to :meth:`~object.__init__` to
initialize the new instance.


Class Instances
^^^^^^^^^^^^^^^

Instances of arbitrary classes can be made callable by defining a
:meth:`~object.__call__` method in their class.


.. _module-objects:

Modules
-------

.. index::
   pair: statement; import
   pair: object; module

Modules are a basic organizational unit of Python code, and are created by
the :ref:`import system <importsystem>` as invoked either by the
:keyword:`import` statement, or by calling
functions such as :func:`importlib.import_module` and built-in
:func:`__import__`.  A module object has a namespace implemented by a
:class:`dictionary <dict>` object (this is the dictionary referenced by the
:attr:`~function.__globals__`
attribute of functions defined in the module).  Attribute references are
translated to lookups in this dictionary, e.g., ``m.x`` is equivalent to
``m.__dict__["x"]``. A module object does not contain the code object used
to initialize the module (since it isn't needed once the initialization is
done).

Attribute assignment updates the module's namespace dictionary, e.g.,
``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.

.. index::
   single: __name__ (module attribute)
   single: __spec__ (module attribute)
   single: __package__ (module attribute)
   single: __loader__ (module attribute)
   single: __path__ (module attribute)
   single: __file__ (module attribute)
   single: __cached__ (module attribute)
   single: __doc__ (module attribute)
   single: __annotations__ (module attribute)
   single: __annotate__ (module attribute)
   pair: module; namespace

.. _import-mod-attrs:

Import-related attributes on module objects
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Module objects have the following attributes that relate to the
:ref:`import system <importsystem>`. When a module is created using the machinery associated
with the import system, these attributes are filled in based on the module's
:term:`spec <module spec>`, before the :term:`loader` executes and loads the
module.

To create a module dynamically rather than using the import system,
it's recommended to use :func:`importlib.util.module_from_spec`,
which will set the various import-controlled attributes to appropriate values.
It's also possible to use the :class:`types.ModuleType` constructor to create
modules directly, but this technique is more error-prone, as most attributes
must be manually set on the module object after it has been created when using
this approach.

.. caution::

   With the exception of :attr:`~module.__name__`, it is **strongly**
   recommended that you rely on :attr:`~module.__spec__` and its attributes
   instead of any of the other individual attributes listed in this subsection.
   Note that updating an attribute on :attr:`!__spec__` will not update the
   corresponding attribute on the module itself:

   .. doctest::

     >>> import typing
     >>> typing.__name__, typing.__spec__.name
     ('typing', 'typing')
     >>> typing.__spec__.name = 'spelling'
     >>> typing.__name__, typing.__spec__.name
     ('typing', 'spelling')
     >>> typing.__name__ = 'keyboard_smashing'
     >>> typing.__name__, typing.__spec__.name
     ('keyboard_smashing', 'spelling')

.. attribute:: module.__name__

   The name used to uniquely identify the module in the import system.
   For a directly executed module, this will be set to ``"__main__"``.

   This attribute must be set to the fully qualified name of the module.
   It is expected to match the value of
   :attr:`module.__spec__.name <importlib.machinery.ModuleSpec.name>`.

.. attribute:: module.__spec__

   A record of the module's import-system-related state.

   Set to the :class:`module spec <importlib.machinery.ModuleSpec>` that was
   used when importing the module. See :ref:`module-specs` for more details.

   .. versionadded:: 3.4

.. attribute:: module.__package__

   The :term:`package` a module belongs to.

   If the module is top-level (that is, not a part of any specific package)
   then the attribute should be set to ``''`` (the empty string). Otherwise,
   it should be set to the name of the module's package (which can be equal to
   :attr:`module.__name__` if the module itself is a package). See :pep:`366`
   for further details.

   This attribute is used instead of :attr:`~module.__name__` to calculate
   explicit relative imports for main modules. It defaults to ``None`` for
   modules created dynamically using the :class:`types.ModuleType` constructor;
   use :func:`importlib.util.module_from_spec` instead to ensure the attribute
   is set to a :class:`str`.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.parent <importlib.machinery.ModuleSpec.parent>`
   instead of :attr:`!module.__package__`. :attr:`__package__` is now only used
   as a fallback if :attr:`!__spec__.parent` is not set, and this fallback
   path is deprecated.

   .. versionchanged:: 3.4
      This attribute now defaults to ``None`` for modules created dynamically
      using the :class:`types.ModuleType` constructor.
      Previously the attribute was optional.

   .. versionchanged:: 3.6
      The value of :attr:`!__package__` is expected to be the same as
      :attr:`__spec__.parent <importlib.machinery.ModuleSpec.parent>`.
      :attr:`__package__` is now only used as a fallback during import
      resolution if :attr:`!__spec__.parent` is not defined.

   .. versionchanged:: 3.10
      :exc:`ImportWarning` is raised if an import resolution falls back to
      :attr:`!__package__` instead of
      :attr:`__spec__.parent <importlib.machinery.ModuleSpec.parent>`.

   .. versionchanged:: 3.12
      Raise :exc:`DeprecationWarning` instead of :exc:`ImportWarning` when
      falling back to :attr:`!__package__` during import resolution.

   .. deprecated-removed:: 3.13 3.15
      :attr:`!__package__` will cease to be set or taken into consideration
      by the import system or standard library.

.. attribute:: module.__loader__

   The :term:`loader` object that the import machinery used to load the module.

   This attribute is mostly useful for introspection, but can be used for
   additional loader-specific functionality, for example getting data
   associated with a loader.

   :attr:`!__loader__` defaults to ``None`` for modules created dynamically
   using the :class:`types.ModuleType` constructor;
   use :func:`importlib.util.module_from_spec` instead to ensure the attribute
   is set to a :term:`loader` object.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.loader <importlib.machinery.ModuleSpec.loader>`
   instead of :attr:`!module.__loader__`.

   .. versionchanged:: 3.4
      This attribute now defaults to ``None`` for modules created dynamically
      using the :class:`types.ModuleType` constructor.
      Previously the attribute was optional.

   .. deprecated-removed:: 3.12 3.16
      Setting :attr:`!__loader__` on a module while failing to set
      :attr:`!__spec__.loader` is deprecated. In Python 3.16,
      :attr:`!__loader__` will cease to be set or taken into consideration by
      the import system or the standard library.

.. attribute:: module.__path__

   A (possibly empty) :term:`sequence` of strings enumerating the locations
   where the package's submodules will be found. Non-package modules should
   not have a :attr:`!__path__` attribute. See :ref:`package-path-rules` for
   more details.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.submodule_search_locations <importlib.machinery.ModuleSpec.submodule_search_locations>`
   instead of :attr:`!module.__path__`.

.. attribute:: module.__file__
.. attribute:: module.__cached__

   :attr:`!__file__` and :attr:`!__cached__` are both optional attributes that
   may or may not be set. Both attributes should be a :class:`str` when they
   are available.

   :attr:`!__file__` indicates the pathname of the file from which the module
   was loaded (if loaded from a file), or the pathname of the shared library
   file for extension modules loaded dynamically from a shared library.
   It might be missing for certain types of modules, such as C modules that are
   statically linked into the interpreter, and the
   :ref:`import system <importsystem>` may opt to leave it unset if it
   has no semantic meaning (for example, a module loaded from a database).

   If :attr:`!__file__` is set then the :attr:`!__cached__` attribute might
   also be set,  which is the path to any compiled version of
   the code (for example, a byte-compiled file). The file does not need to exist
   to set this attribute; the path can simply point to where the
   compiled file *would* exist (see :pep:`3147`).

   Note that :attr:`!__cached__` may be set even if :attr:`!__file__` is not
   set.  However, that scenario is quite atypical.  Ultimately, the
   :term:`loader` is what makes use of the module spec provided by the
   :term:`finder` (from which :attr:`!__file__` and :attr:`!__cached__` are
   derived).  So if a loader can load from a cached module but otherwise does
   not load from a file, that atypical scenario may be appropriate.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.cached <importlib.machinery.ModuleSpec.cached>`
   instead of :attr:`!module.__cached__`.

   .. deprecated-removed:: 3.13 3.15
      Setting :attr:`!__cached__` on a module while failing to set
      :attr:`!__spec__.cached` is deprecated. In Python 3.15,
      :attr:`!__cached__` will cease to be set or taken into consideration by
      the import system or standard library.

Other writable attributes on module objects
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

As well as the import-related attributes listed above, module objects also have
the following writable attributes:

.. attribute:: module.__doc__

   The module's documentation string, or ``None`` if unavailable.
   See also: :attr:`__doc__ attributes <definition.__doc__>`.

.. attribute:: module.__annotations__

   A dictionary containing :term:`variable annotations <variable annotation>`
   collected during module body execution.  For best practices on working with
   :attr:`!__annotations__`, see :mod:`annotationlib`.

   .. versionchanged:: 3.14
      Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
      See :pep:`649`.

.. attribute:: module.__annotate__

   The :term:`annotate function` for this module, or ``None`` if the module has
   no annotations. See also: :attr:`~object.__annotate__` attributes.

   .. versionadded:: 3.14

Module dictionaries
^^^^^^^^^^^^^^^^^^^

Module objects also have the following special read-only attribute:

.. index:: single: __dict__ (module attribute)
.. attribute:: module.__dict__

   The module's namespace as a dictionary object. Uniquely among the attributes
   listed here, :attr:`!__dict__` cannot be accessed as a global variable from
   within a module; it can only be accessed as an attribute on module objects.

   .. impl-detail::

      Because of the way CPython clears module dictionaries, the module
      dictionary will be cleared when the module falls out of scope even if the
      dictionary still has live references.  To avoid this, copy the dictionary
      or keep the module around while using its dictionary directly.


.. _class-attrs-and-methods:

Custom classes
--------------

Custom class types are typically created by class definitions (see section
:ref:`class`).  A class has a namespace implemented by a dictionary object.
Class attribute references are translated to lookups in this dictionary, e.g.,
``C.x`` is translated to ``C.__dict__["x"]`` (although there are a number of
hooks which allow for other means of locating attributes). When the attribute
name is not found there, the attribute search continues in the base classes.
This search of the base classes uses the C3 method resolution order which
behaves correctly even in the presence of 'diamond' inheritance structures
where there are multiple inheritance paths leading back to a common ancestor.
Additional details on the C3 MRO used by Python can be found at
:ref:`python_2.3_mro`.

.. index::
   pair: object; class
   pair: object; class instance
   pair: object; instance
   pair: class object; call
   single: container
   pair: object; dictionary
   pair: class; attribute

When a class attribute reference (for class :class:`!C`, say) would yield a
class method object, it is transformed into an instance method object whose
:attr:`~method.__self__` attribute is :class:`!C`.
When it would yield a :class:`staticmethod` object,
it is transformed into the object wrapped by the static method
object. See section :ref:`descriptors` for another way in which attributes
retrieved from a class may differ from those actually contained in its
:attr:`~object.__dict__`.

.. index:: triple: class; attribute; assignment

Class attribute assignments update the class's dictionary, never the dictionary
of a base class.

.. index:: pair: class object; call

A class object can be called (see above) to yield a class instance (see below).

Special attributes
^^^^^^^^^^^^^^^^^^

.. index::
   single: __name__ (class attribute)
   single: __module__ (class attribute)
   single: __dict__ (class attribute)
   single: __bases__ (class attribute)
   single: __doc__ (class attribute)
   single: __annotations__ (class attribute)
   single: __annotate__ (class attribute)
   single: __type_params__ (class attribute)
   single: __static_attributes__ (class attribute)
   single: __firstlineno__ (class attribute)

.. list-table::
   :header-rows: 1

   * - Attribute
     - Meaning

   * - .. attribute:: type.__name__
     - The class's name.
       See also: :attr:`__name__ attributes <definition.__name__>`.

   * - .. attribute:: type.__qualname__
     - The class's :term:`qualified name`.
       See also: :attr:`__qualname__ attributes <definition.__qualname__>`.

   * - .. attribute:: type.__module__
     - The name of the module in which the class was defined.

   * - .. attribute:: type.__dict__
     - A :class:`mapping proxy <types.MappingProxyType>`
       providing a read-only view of the class's namespace.
       See also: :attr:`__dict__ attributes <object.__dict__>`.

   * - .. attribute:: type.__bases__
     - A :class:`tuple` containing the class's bases.
       In most cases, for a class defined as ``class X(A, B, C)``,
       ``X.__bases__`` will be exactly equal to ``(A, B, C)``.

   * - .. attribute:: type.__doc__
     - The class's documentation string, or ``None`` if undefined.
       Not inherited by subclasses.

   * - .. attribute:: type.__annotations__
     - A dictionary containing
       :term:`variable annotations <variable annotation>`
       collected during class body execution. See also:
       :attr:`__annotations__ attributes <object.__annotations__>`.

       For best practices on working with :attr:`~object.__annotations__`,
       please see :mod:`annotationlib`.

       .. caution::

          Accessing the :attr:`!__annotations__` attribute of a class
          object directly may yield incorrect results in the presence of
          metaclasses. In addition, the attribute may not exist for
          some classes. Use :func:`annotationlib.get_annotations` to
          retrieve class annotations safely.

       .. versionchanged:: 3.14
          Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
          See :pep:`649`.

   * - .. method:: type.__annotate__
     - The :term:`annotate function` for this class, or ``None``
       if the class has no annotations.
       See also: :attr:`__annotate__ attributes <object.__annotate__>`.

       .. caution::

          Accessing the :attr:`!__annotate__` attribute of a class
          object directly may yield incorrect results in the presence of
          metaclasses. Use :func:`annotationlib.get_annotate_function` to
          retrieve the annotate function safely.

       .. versionadded:: 3.14

   * - .. attribute:: type.__type_params__
     - A :class:`tuple` containing the :ref:`type parameters <type-params>` of
       a :ref:`generic class <generic-classes>`.

       .. versionadded:: 3.12

   * - .. attribute:: type.__static_attributes__
     - A :class:`tuple` containing names of attributes of this class which are
       assigned through ``self.X`` from any function in its body.

       .. versionadded:: 3.13

   * - .. attribute:: type.__firstlineno__
     - The line number of the first line of the class definition,
       including decorators.
       Setting the :attr:`__module__` attribute removes the
       :attr:`!__firstlineno__` item from the type's dictionary.

       .. versionadded:: 3.13

   * - .. attribute:: type.__mro__
     - The :class:`tuple` of classes that are considered when looking for
       base classes during method resolution.


Special methods
^^^^^^^^^^^^^^^

In addition to the special attributes described above, all Python classes also
have the following two methods available:

.. method:: type.mro

   This method can be overridden by a metaclass to customize the method
   resolution order for its instances.  It is called at class instantiation,
   and its result is stored in :attr:`~type.__mro__`.

.. method:: type.__subclasses__

   Each class keeps a list of weak references to its immediate subclasses. This
   method returns a list of all those references still alive. The list is in
   definition order. Example:

   .. doctest::

      >>> class A: pass
      >>> class B(A): pass
      >>> A.__subclasses__()
      [<class 'B'>]

Class instances
---------------

.. index::
   pair: object; class instance
   pair: object; instance
   pair: class; instance
   pair: class instance; attribute

A class instance is created by calling a class object (see above).  A class
instance has a namespace implemented as a dictionary which is the first place
in which attribute references are searched.  When an attribute is not found
there, and the instance's class has an attribute by that name, the search
continues with the class attributes.  If a class attribute is found that is a
user-defined function object, it is transformed into an instance method
object whose :attr:`~method.__self__` attribute is the instance.  Static method and
class method objects are also transformed; see above under "Classes".  See
section :ref:`descriptors` for another way in which attributes of a class
retrieved via its instances may differ from the objects actually stored in
the class's :attr:`~object.__dict__`.  If no class attribute is found, and the
object's class has a :meth:`~object.__getattr__` method, that is called to satisfy
the lookup.

.. index:: triple: class instance; attribute; assignment

Attribute assignments and deletions update the instance's dictionary, never a
class's dictionary.  If the class has a :meth:`~object.__setattr__` or
:meth:`~object.__delattr__` method, this is called instead of updating the instance
dictionary directly.

.. index::
   pair: object; numeric
   pair: object; sequence
   pair: object; mapping

Class instances can pretend to be numbers, sequences, or mappings if they have
methods with certain special names.  See section :ref:`specialnames`.

Special attributes
^^^^^^^^^^^^^^^^^^

.. index::
   single: __dict__ (instance attribute)
   single: __class__ (instance attribute)

.. attribute:: object.__class__

   The class to which a class instance belongs.

.. attribute:: object.__dict__

   A dictionary or other mapping object used to store an object's (writable)
   attributes. Not all instances have a :attr:`!__dict__` attribute; see the
   section on :ref:`slots` for more details.


I/O objects (also known as file objects)
----------------------------------------

.. index::
   pair: built-in function; open
   pair: module; io
   single: popen() (in module os)
   single: makefile() (socket method)
   single: sys.stdin
   single: sys.stdout
   single: sys.stderr
   single: stdio
   single: stdin (in module sys)
   single: stdout (in module sys)
   single: stderr (in module sys)

A :term:`file object` represents an open file.  Various shortcuts are
available to create file objects: the :func:`open` built-in function, and
also :func:`os.popen`, :func:`os.fdopen`, and the
:meth:`~socket.socket.makefile` method of socket objects (and perhaps by
other functions or methods provided by extension modules).

The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are
initialized to file objects corresponding to the interpreter's standard
input, output and error streams; they are all open in text mode and
therefore follow the interface defined by the :class:`io.TextIOBase`
abstract class.


Internal types
--------------

.. index::
   single: internal type
   single: types, internal

A few types used internally by the interpreter are exposed to the user. Their
definitions may change with future versions of the interpreter, but they are
mentioned here for completeness.


.. _code-objects:

Code objects
^^^^^^^^^^^^

.. index:: bytecode, object; code, code object

Code objects represent *byte-compiled* executable Python code, or :term:`bytecode`.
The difference between a code object and a function object is that the function
object contains an explicit reference to the function's globals (the module in
which it was defined), while a code object contains no context; also the default
argument values are stored in the function object, not in the code object
(because they represent values calculated at run-time).  Unlike function
objects, code objects are immutable and contain no references (directly or
indirectly) to mutable objects.

.. index::
   single: co_argcount (code object attribute)
   single: co_posonlyargcount (code object attribute)
   single: co_kwonlyargcount (code object attribute)
   single: co_code (code object attribute)
   single: co_consts (code object attribute)
   single: co_filename (code object attribute)
   single: co_firstlineno (code object attribute)
   single: co_flags (code object attribute)
   single: co_lnotab (code object attribute)
   single: co_name (code object attribute)
   single: co_names (code object attribute)
   single: co_nlocals (code object attribute)
   single: co_stacksize (code object attribute)
   single: co_varnames (code object attribute)
   single: co_cellvars (code object attribute)
   single: co_freevars (code object attribute)
   single: co_qualname (code object attribute)

Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. list-table::

   * - .. attribute:: codeobject.co_name
     - The function name

   * - .. attribute:: codeobject.co_qualname
     - The fully qualified function name

       .. versionadded:: 3.11

   * - .. attribute:: codeobject.co_argcount
     - The total number of positional :term:`parameters <parameter>`
       (including positional-only parameters and parameters with default values)
       that the function has

   * - .. attribute:: codeobject.co_posonlyargcount
     - The number of positional-only :term:`parameters <parameter>`
       (including arguments with default values) that the function has

   * - .. attribute:: codeobject.co_kwonlyargcount
     - The number of keyword-only :term:`parameters <parameter>`
       (including arguments with default values) that the function has

   * - .. attribute:: codeobject.co_nlocals
     - The number of :ref:`local variables <naming>` used by the function
       (including parameters)

   * - .. attribute:: codeobject.co_varnames
     - A :class:`tuple` containing the names of the local variables in the
       function (starting with the parameter names)

   * - .. attribute:: codeobject.co_cellvars
     - A :class:`tuple` containing the names of :ref:`local variables <naming>`
       that are referenced from at least one :term:`nested scope` inside the function

   * - .. attribute:: codeobject.co_freevars
     - A :class:`tuple` containing the names of
       :term:`free (closure) variables <closure variable>` that a :term:`nested scope`
       references in an outer scope. See also :attr:`function.__closure__`.

       Note: references to global and builtin names are *not* included.

   * - .. attribute:: codeobject.co_code
     - A string representing the sequence of :term:`bytecode` instructions in
       the function

   * - .. attribute:: codeobject.co_consts
     - A :class:`tuple` containing the literals used by the :term:`bytecode` in
       the function

   * - .. attribute:: codeobject.co_names
     - A :class:`tuple` containing the names used by the :term:`bytecode` in
       the function

   * - .. attribute:: codeobject.co_filename
     - The name of the file from which the code was compiled

   * - .. attribute:: codeobject.co_firstlineno
     - The line number of the first line of the function

   * - .. attribute:: codeobject.co_lnotab
     - A string encoding the mapping from :term:`bytecode` offsets to line
       numbers. For details, see the source code of the interpreter.

       .. deprecated:: 3.12
          This attribute of code objects is deprecated, and may be removed in
          Python 3.15.

   * - .. attribute:: codeobject.co_stacksize
     - The required stack size of the code object

   * - .. attribute:: codeobject.co_flags
     - An :class:`integer <int>` encoding a number of flags for the
       interpreter.

.. index:: pair: object; generator

The following flag bits are defined for :attr:`~codeobject.co_flags`:
bit ``0x04`` is set if
the function uses the ``*arguments`` syntax to accept an arbitrary number of
positional arguments; bit ``0x08`` is set if the function uses the
``**keywords`` syntax to accept arbitrary keyword arguments; bit ``0x20`` is set
if the function is a generator. See :ref:`inspect-module-co-flags` for details
on the semantics of each flags that might be present.

Future feature declarations (for example, ``from __future__ import division``) also use bits
in :attr:`~codeobject.co_flags` to indicate whether a code object was compiled with a
particular feature enabled. See :attr:`~__future__._Feature.compiler_flag`.

Other bits in :attr:`~codeobject.co_flags` are reserved for internal use.

.. index:: single: documentation string

If a code object represents a function and has a docstring,
the :data:`~inspect.CO_HAS_DOCSTRING` bit is set in :attr:`~codeobject.co_flags`
and the first item in :attr:`~codeobject.co_consts` is
the docstring of the function.

Methods on code objects
~~~~~~~~~~~~~~~~~~~~~~~

.. method:: codeobject.co_positions()

   Returns an iterable over the source code positions of each :term:`bytecode`
   instruction in the code object.

   The iterator returns :class:`tuple`\s containing the ``(start_line, end_line,
   start_column, end_column)``. The *i-th* tuple corresponds to the
   position of the source code that compiled to the *i-th* code unit.
   Column information is 0-indexed utf-8 byte offsets on the given source
   line.

   This positional information can be missing. A non-exhaustive lists of
   cases where this may happen:

   - Running the interpreter with :option:`-X` ``no_debug_ranges``.
   - Loading a pyc file compiled while using :option:`-X` ``no_debug_ranges``.
   - Position tuples corresponding to artificial instructions.
   - Line and column numbers that can't be represented due to
     implementation specific limitations.

   When this occurs, some or all of the tuple elements can be
   :const:`None`.

   .. versionadded:: 3.11

   .. note::
      This feature requires storing column positions in code objects which may
      result in a small increase of disk usage of compiled Python files or
      interpreter memory usage. To avoid storing the extra information and/or
      deactivate printing the extra traceback information, the
      :option:`-X` ``no_debug_ranges`` command line flag or the :envvar:`PYTHONNODEBUGRANGES`
      environment variable can be used.

.. method:: codeobject.co_lines()

   Returns an iterator that yields information about successive ranges of
   :term:`bytecode`\s. Each item yielded is a ``(start, end, lineno)``
   :class:`tuple`:

   * ``start`` (an :class:`int`) represents the offset (inclusive) of the start
     of the :term:`bytecode` range
   * ``end`` (an :class:`int`) represents the offset (exclusive) of the end of
     the :term:`bytecode` range
   * ``lineno`` is an :class:`int` representing the line number of the
     :term:`bytecode` range, or ``None`` if the bytecodes in the given range
     have no line number

   The items yielded will have the following properties:

   * The first range yielded will have a ``start`` of 0.
   * The ``(start, end)`` ranges will be non-decreasing and consecutive. That
     is, for any pair of :class:`tuple`\s, the ``start`` of the second will be
     equal to the ``end`` of the first.
   * No range will be backwards: ``end >= start`` for all triples.
   * The last :class:`tuple` yielded will have ``end`` equal to the size of the
     :term:`bytecode`.

   Zero-width ranges, where ``start == end``, are allowed. Zero-width ranges
   are used for lines that are present in the source code, but have been
   eliminated by the :term:`bytecode` compiler.

   .. versionadded:: 3.10

   .. seealso::

      :pep:`626` - Precise line numbers for debugging and other tools.
         The PEP that introduced the :meth:`!co_lines` method.

.. method:: codeobject.replace(**kwargs)

   Return a copy of the code object with new values for the specified fields.

   Code objects are also supported by the generic function :func:`copy.replace`.

   .. versionadded:: 3.8


.. _frame-objects:

Frame objects
^^^^^^^^^^^^^

.. index:: pair: object; frame

Frame objects represent execution frames.  They may occur in
:ref:`traceback objects <traceback-objects>`,
and are also passed to registered trace functions.

.. index::
   single: f_back (frame attribute)
   single: f_code (frame attribute)
   single: f_globals (frame attribute)
   single: f_locals (frame attribute)
   single: f_lasti (frame attribute)
   single: f_builtins (frame attribute)

Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. list-table::

   * - .. attribute:: frame.f_back
     - Points to the previous stack frame (towards the caller),
       or ``None`` if this is the bottom stack frame

   * - .. attribute:: frame.f_code
     - The :ref:`code object <code-objects>` being executed in this frame.
       Accessing this attribute raises an :ref:`auditing event <auditing>`
       ``object.__getattr__`` with arguments ``obj`` and ``"f_code"``.

   * - .. attribute:: frame.f_locals
     - The mapping used by the frame to look up
       :ref:`local variables <naming>`.
       If the frame refers to an :term:`optimized scope`,
       this may return a write-through proxy object.

       .. versionchanged:: 3.13
          Return a proxy for optimized scopes.

   * - .. attribute:: frame.f_globals
     - The dictionary used by the frame to look up
       :ref:`global variables <naming>`

   * - .. attribute:: frame.f_builtins
     - The dictionary used by the frame to look up
       :ref:`built-in (intrinsic) names <naming>`

   * - .. attribute:: frame.f_lasti
     - The "precise instruction" of the frame object
       (this is an index into the :term:`bytecode` string of the
       :ref:`code object <code-objects>`)

.. index::
   single: f_trace (frame attribute)
   single: f_trace_lines (frame attribute)
   single: f_trace_opcodes (frame attribute)
   single: f_lineno (frame attribute)

Special writable attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. list-table::

   * - .. attribute:: frame.f_trace
     - If not ``None``, this is a function called for various events during
       code execution (this is used by debuggers). Normally an event is
       triggered for each new source line (see :attr:`~frame.f_trace_lines`).

   * - .. attribute:: frame.f_trace_lines
     - Set this attribute to :const:`False` to disable triggering a tracing
       event for each source line.

   * - .. attribute:: frame.f_trace_opcodes
     - Set this attribute to :const:`True` to allow per-opcode events to be
       requested. Note that this may lead to
       undefined interpreter behaviour if exceptions raised by the trace
       function escape to the function being traced.

   * - .. attribute:: frame.f_lineno
     - The current line number of the frame -- writing to this
       from within a trace function jumps to the given line (only for the bottom-most
       frame).  A debugger can implement a Jump command (aka Set Next Statement)
       by writing to this attribute.

Frame object methods
~~~~~~~~~~~~~~~~~~~~

Frame objects support one method:

.. method:: frame.clear()

   This method clears all references to :ref:`local variables <naming>` held by the
   frame.  Also, if the frame belonged to a :term:`generator`, the generator
   is finalized.  This helps break reference cycles involving frame
   objects (for example when catching an :ref:`exception <bltin-exceptions>`
   and storing its :ref:`traceback <traceback-objects>` for later use).

   :exc:`RuntimeError` is raised if the frame is currently executing
   or suspended.

   .. versionadded:: 3.4

   .. versionchanged:: 3.13
      Attempting to clear a suspended frame raises :exc:`RuntimeError`
      (as has always been the case for executing frames).


.. _traceback-objects:

Traceback objects
^^^^^^^^^^^^^^^^^

.. index::
   pair: object; traceback
   pair: stack; trace
   pair: exception; handler
   pair: execution; stack
   single: exc_info (in module sys)
   single: last_traceback (in module sys)
   single: sys.exc_info
   single: sys.exception
   single: sys.last_traceback

Traceback objects represent the stack trace of an :ref:`exception <tut-errors>`.
A traceback object
is implicitly created when an exception occurs, and may also be explicitly
created by calling :class:`types.TracebackType`.

.. versionchanged:: 3.7
   Traceback objects can now be explicitly instantiated from Python code.

For implicitly created tracebacks, when the search for an exception handler
unwinds the execution stack, at each unwound level a traceback object is
inserted in front of the current traceback.  When an exception handler is
entered, the stack trace is made available to the program. (See section
:ref:`try`.) It is accessible as the third item of the
tuple returned by :func:`sys.exc_info`, and as the
:attr:`~BaseException.__traceback__` attribute
of the caught exception.

When the program contains no suitable
handler, the stack trace is written (nicely formatted) to the standard error
stream; if the interpreter is interactive, it is also made available to the user
as :data:`sys.last_traceback`.

For explicitly created tracebacks, it is up to the creator of the traceback
to determine how the :attr:`~traceback.tb_next` attributes should be linked to
form a full stack trace.

.. index::
   single: tb_frame (traceback attribute)
   single: tb_lineno (traceback attribute)
   single: tb_lasti (traceback attribute)
   pair: statement; try

Special read-only attributes:

.. list-table::

   * - .. attribute:: traceback.tb_frame
     - Points to the execution :ref:`frame <frame-objects>` of the current
       level.

       Accessing this attribute raises an
       :ref:`auditing event <auditing>` ``object.__getattr__`` with arguments
       ``obj`` and ``"tb_frame"``.

   * - .. attribute:: traceback.tb_lineno
     - Gives the line number where the exception occurred

   * - .. attribute:: traceback.tb_lasti
     - Indicates the "precise instruction".

The line number and last instruction in the traceback may differ from the
line number of its :ref:`frame object <frame-objects>` if the exception
occurred in a
:keyword:`try` statement with no matching except clause or with a
:keyword:`finally` clause.

.. index::
   single: tb_next (traceback attribute)

.. attribute:: traceback.tb_next

   The special writable attribute :attr:`!tb_next` is the next level in the
   stack trace (towards the frame where the exception occurred), or ``None`` if
   there is no next level.

   .. versionchanged:: 3.7
      This attribute is now writable


Slice objects
^^^^^^^^^^^^^

.. index:: pair: built-in function; slice

Slice objects are used to represent slices for
:meth:`~object.__getitem__`
methods.  They are also created by the built-in :func:`slice` function.

.. index::
   single: start (slice object attribute)
   single: stop (slice object attribute)
   single: step (slice object attribute)

Special read-only attributes: :attr:`~slice.start` is the lower bound;
:attr:`~slice.stop` is the upper bound; :attr:`~slice.step` is the step
value; each is ``None`` if omitted.  These attributes can have any type.

Slice objects support one method:

.. method:: slice.indices(self, length)

   This method takes a single integer argument *length* and computes
   information about the slice that the slice object would describe if
   applied to a sequence of *length* items.  It returns a tuple of three
   integers; respectively these are the *start* and *stop* indices and the
   *step* or stride length of the slice. Missing or out-of-bounds indices
   are handled in a manner consistent with regular slices.


Static method objects
^^^^^^^^^^^^^^^^^^^^^

Static method objects provide a way of defeating the transformation of function
objects to method objects described above. A static method object is a wrapper
around any other object, usually a user-defined method object. When a static
method object is retrieved from a class or a class instance, the object actually
returned is the wrapped object, which is not subject to any further
transformation. Static method objects are also callable. Static method
objects are created by the built-in :func:`staticmethod` constructor.


Class method objects
^^^^^^^^^^^^^^^^^^^^

A class method object, like a static method object, is a wrapper around another
object that alters the way in which that object is retrieved from classes and
class instances. The behaviour of class method objects upon such retrieval is
described above, under :ref:`"instance methods" <instance-methods>`. Class method objects are created
by the built-in :func:`classmethod` constructor.


.. _specialnames:

Special method names
====================

.. index::
   pair: operator; overloading
   single: __getitem__() (mapping object method)

A class can implement certain operations that are invoked by special syntax
(such as arithmetic operations or subscripting and slicing) by defining methods
with special names. This is Python's approach to :dfn:`operator overloading`,
allowing classes to define their own behavior with respect to language
operators.  For instance, if a class defines a method named
:meth:`~object.__getitem__`,
and ``x`` is an instance of this class, then ``x[i]`` is roughly equivalent
to ``type(x).__getitem__(x, i)``.  Except where mentioned, attempts to execute an
operation raise an exception when no appropriate method is defined (typically
:exc:`AttributeError` or :exc:`TypeError`).

Setting a special method to ``None`` indicates that the corresponding
operation is not available.  For example, if a class sets
:meth:`~object.__iter__` to ``None``, the class is not iterable, so calling
:func:`iter` on its instances will raise a :exc:`TypeError` (without
falling back to :meth:`~object.__getitem__`). [#]_

When implementing a class that emulates any built-in type, it is important that
the emulation only be implemented to the degree that it makes sense for the
object being modelled.  For example, some sequences may work well with retrieval
of individual elements, but extracting a slice may not make sense.  (One example
of this is the :class:`~xml.dom.NodeList` interface in the W3C's Document
Object Model.)


.. _customization:

Basic customization
-------------------

.. method:: object.__new__(cls[, ...])

   .. index:: pair: subclassing; immutable types

   Called to create a new instance of class *cls*.  :meth:`__new__` is a static
   method (special-cased so you need not declare it as such) that takes the class
   of which an instance was requested as its first argument.  The remaining
   arguments are those passed to the object constructor expression (the call to the
   class).  The return value of :meth:`__new__` should be the new object instance
   (usually an instance of *cls*).

   Typical implementations create a new instance of the class by invoking the
   superclass's :meth:`__new__` method using ``super().__new__(cls[, ...])``
   with appropriate arguments and then modifying the newly created instance
   as necessary before returning it.

   If :meth:`__new__` is invoked during object construction and it returns an
   instance of *cls*, then the new instance’s :meth:`__init__` method
   will be invoked like ``__init__(self[, ...])``, where *self* is the new instance
   and the remaining arguments are the same as were passed to the object constructor.

   If :meth:`__new__` does not return an instance of *cls*, then the new instance's
   :meth:`__init__` method will not be invoked.

   :meth:`__new__` is intended mainly to allow subclasses of immutable types (like
   int, str, or tuple) to customize instance creation.  It is also commonly
   overridden in custom metaclasses in order to customize class creation.


.. method:: object.__init__(self[, ...])

   .. index:: pair: class; constructor

   Called after the instance has been created (by :meth:`__new__`), but before
   it is returned to the caller.  The arguments are those passed to the
   class constructor expression.  If a base class has an :meth:`__init__`
   method, the derived class's :meth:`__init__` method, if any, must explicitly
   call it to ensure proper initialization of the base class part of the
   instance; for example: ``super().__init__([args...])``.

   Because :meth:`__new__` and :meth:`__init__` work together in constructing
   objects (:meth:`__new__` to create it, and :meth:`__init__` to customize it),
   no non-``None`` value may be returned by :meth:`__init__`; doing so will
   cause a :exc:`TypeError` to be raised at runtime.


.. method:: object.__del__(self)

   .. index::
      single: destructor
      single: finalizer
      pair: statement; del

   Called when the instance is about to be destroyed.  This is also called a
   finalizer or (improperly) a destructor.  If a base class has a
   :meth:`__del__` method, the derived class's :meth:`__del__` method,
   if any, must explicitly call it to ensure proper deletion of the base
   class part of the instance.

   It is possible (though not recommended!) for the :meth:`__del__` method
   to postpone destruction of the instance by creating a new reference to
   it.  This is called object *resurrection*.  It is implementation-dependent
   whether :meth:`__del__` is called a second time when a resurrected object
   is about to be destroyed; the current :term:`CPython` implementation
   only calls it once.

   It is not guaranteed that :meth:`__del__` methods are called for objects
   that still exist when the interpreter exits.
   :class:`weakref.finalize` provides a straightforward way to register
   a cleanup function to be called when an object is garbage collected.

   .. note::

      ``del x`` doesn't directly call ``x.__del__()`` --- the former decrements
      the reference count for ``x`` by one, and the latter is only called when
      ``x``'s reference count reaches zero.

   .. impl-detail::
      It is possible for a reference cycle to prevent the reference count
      of an object from going to zero.  In this case, the cycle will be
      later detected and deleted by the :term:`cyclic garbage collector
      <garbage collection>`.  A common cause of reference cycles is when
      an exception has been caught in a local variable.  The frame's
      locals then reference the exception, which references its own
      traceback, which references the locals of all frames caught in the
      traceback.

      .. seealso::
         Documentation for the :mod:`gc` module.

   .. warning::

      Due to the precarious circumstances under which :meth:`__del__` methods are
      invoked, exceptions that occur during their execution are ignored, and a warning
      is printed to ``sys.stderr`` instead.  In particular:

      * :meth:`__del__` can be invoked when arbitrary code is being executed,
        including from any arbitrary thread.  If :meth:`__del__` needs to take
        a lock or invoke any other blocking resource, it may deadlock as
        the resource may already be taken by the code that gets interrupted
        to execute :meth:`__del__`.

      * :meth:`__del__` can be executed during interpreter shutdown.  As a
        consequence, the global variables it needs to access (including other
        modules) may already have been deleted or set to ``None``. Python
        guarantees that globals whose name begins with a single underscore
        are deleted from their module before other globals are deleted; if
        no other references to such globals exist, this may help in assuring
        that imported modules are still available at the time when the
        :meth:`__del__` method is called.


   .. index::
      single: repr() (built-in function); __repr__() (object method)

.. method:: object.__repr__(self)

   Called by the :func:`repr` built-in function to compute the "official" string
   representation of an object.  If at all possible, this should look like a
   valid Python expression that could be used to recreate an object with the
   same value (given an appropriate environment).  If this is not possible, a
   string of the form ``<...some useful description...>`` should be returned.
   The return value must be a string object. If a class defines :meth:`__repr__`
   but not :meth:`__str__`, then :meth:`__repr__` is also used when an
   "informal" string representation of instances of that class is required.

   This is typically used for debugging, so it is important that the representation
   is information-rich and unambiguous. A default implementation is provided by the
   :class:`object` class itself.

   .. index::
      single: string; __str__() (object method)
      single: format() (built-in function); __str__() (object method)
      single: print() (built-in function); __str__() (object method)


.. method:: object.__str__(self)

   Called by :func:`str(object) <str>`, the default :meth:`__format__` implementation,
   and the built-in function :func:`print`, to compute the "informal" or nicely
   printable string representation of an object.  The return value must be a
   :ref:`str <textseq>` object.

   This method differs from :meth:`object.__repr__` in that there is no
   expectation that :meth:`__str__` return a valid Python expression: a more
   convenient or concise representation can be used.

   The default implementation defined by the built-in type :class:`object`
   calls :meth:`object.__repr__`.

   .. XXX what about subclasses of string?


.. method:: object.__bytes__(self)

   .. index:: pair: built-in function; bytes

   Called by :ref:`bytes <func-bytes>` to compute a byte-string representation
   of an object. This should return a :class:`bytes` object. The :class:`object`
   class itself does not provide this method.

   .. index::
      single: string; __format__() (object method)
      pair: string; conversion
      pair: built-in function; print


.. method:: object.__format__(self, format_spec)

   Called by the :func:`format` built-in function,
   and by extension, evaluation of :ref:`formatted string literals
   <f-strings>` and the :meth:`str.format` method, to produce a "formatted"
   string representation of an object. The *format_spec* argument is
   a string that contains a description of the formatting options desired.
   The interpretation of the *format_spec* argument is up to the type
   implementing :meth:`__format__`, however most classes will either
   delegate formatting to one of the built-in types, or use a similar
   formatting option syntax.

   See :ref:`formatspec` for a description of the standard formatting syntax.

   The return value must be a string object.

   The default implementation by the :class:`object` class should be given
   an empty *format_spec* string. It delegates to :meth:`__str__`.

   .. versionchanged:: 3.4
      The __format__ method of ``object`` itself raises a :exc:`TypeError`
      if passed any non-empty string.

   .. versionchanged:: 3.7
      ``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather
      than ``format(str(x), '')``.


.. _richcmpfuncs:
.. method:: object.__lt__(self, other)
            object.__le__(self, other)
            object.__eq__(self, other)
            object.__ne__(self, other)
            object.__gt__(self, other)
            object.__ge__(self, other)

   .. index::
      single: comparisons

   These are the so-called "rich comparison" methods. The correspondence between
   operator symbols and method names is as follows: ``x<y`` calls ``x.__lt__(y)``,
   ``x<=y`` calls ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls
   ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls
   ``x.__ge__(y)``.

   A rich comparison method may return the singleton :data:`NotImplemented` if it does
   not implement the operation for a given pair of arguments. By convention,
   ``False`` and ``True`` are returned for a successful comparison. However, these
   methods can return any value, so if the comparison operator is used in a Boolean
   context (e.g., in the condition of an ``if`` statement), Python will call
   :func:`bool` on the value to determine if the result is true or false.

   By default, ``object`` implements :meth:`__eq__` by using ``is``, returning
   :data:`NotImplemented` in the case of a false comparison:
   ``True if x is y else NotImplemented``. For :meth:`__ne__`, by default it
   delegates to :meth:`__eq__` and inverts the result unless it is
   :data:`!NotImplemented`.  There are no other implied relationships among the
   comparison operators or default implementations; for example, the truth of
   ``(x<y or x==y)`` does not imply ``x<=y``. To automatically generate ordering
   operations from a single root operation, see :func:`functools.total_ordering`.

   By default, the :class:`object` class provides implementations consistent
   with :ref:`expressions-value-comparisons`: equality compares according to
   object identity, and order comparisons raise :exc:`TypeError`. Each default
   method may generate these results directly, but may also return
   :data:`NotImplemented`.

   See the paragraph on :meth:`__hash__` for
   some important notes on creating :term:`hashable` objects which support
   custom comparison operations and are usable as dictionary keys.

   There are no swapped-argument versions of these methods (to be used when the
   left argument does not support the operation but the right argument does);
   rather, :meth:`__lt__` and :meth:`__gt__` are each other's reflection,
   :meth:`__le__` and :meth:`__ge__` are each other's reflection, and
   :meth:`__eq__` and :meth:`__ne__` are their own reflection.
   If the operands are of different types, and the right operand's type is
   a direct or indirect subclass of the left operand's type,
   the reflected method of the right operand has priority, otherwise
   the left operand's method has priority.  Virtual subclassing is
   not considered.

   When no appropriate method returns any value other than :data:`NotImplemented`, the
   ``==`` and ``!=`` operators will fall back to ``is`` and ``is not``, respectively.

.. method:: object.__hash__(self)

   .. index::
      pair: object; dictionary
      pair: built-in function; hash

   Called by built-in function :func:`hash` and for operations on members of
   hashed collections including :class:`set`, :class:`frozenset`, and
   :class:`dict`.  The ``__hash__()`` method should return an integer. The only required
   property is that objects which compare equal have the same hash value; it is
   advised to mix together the hash values of the components of the object that
   also play a part in comparison of objects by packing them into a tuple and
   hashing the tuple. Example::

       def __hash__(self):
           return hash((self.name, self.nick, self.color))

   .. note::

     :func:`hash` truncates the value returned from an object's custom
     :meth:`__hash__` method to the size of a :c:type:`Py_ssize_t`.  This is
     typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.  If an
     object's   :meth:`__hash__` must interoperate on builds of different bit
     sizes, be sure to check the width on all supported builds.  An easy way
     to do this is with
     ``python -c "import sys; print(sys.hash_info.width)"``.

   If a class does not define an :meth:`__eq__` method it should not define a
   :meth:`__hash__` operation either; if it defines :meth:`__eq__` but not
   :meth:`__hash__`, its instances will not be usable as items in hashable
   collections.  If a class defines mutable objects and implements an
   :meth:`__eq__` method, it should not implement :meth:`__hash__`, since the
   implementation of :term:`hashable` collections requires that a key's hash value is
   immutable (if the object's hash value changes, it will be in the wrong hash
   bucket).

   User-defined classes have :meth:`__eq__` and :meth:`__hash__` methods
   by default (inherited from the :class:`object` class); with them, all objects compare
   unequal (except with themselves) and ``x.__hash__()`` returns an appropriate
   value such that ``x == y`` implies both that ``x is y`` and ``hash(x) == hash(y)``.

   A class that overrides :meth:`__eq__` and does not define :meth:`__hash__`
   will have its :meth:`__hash__` implicitly set to ``None``.  When the
   :meth:`__hash__` method of a class is ``None``, instances of the class will
   raise an appropriate :exc:`TypeError` when a program attempts to retrieve
   their hash value, and will also be correctly identified as unhashable when
   checking ``isinstance(obj, collections.abc.Hashable)``.

   If a class that overrides :meth:`__eq__` needs to retain the implementation
   of :meth:`__hash__` from a parent class, the interpreter must be told this
   explicitly by setting ``__hash__ = <ParentClass>.__hash__``.

   If a class that does not override :meth:`__eq__` wishes to suppress hash
   support, it should include ``__hash__ = None`` in the class definition.
   A class which defines its own :meth:`__hash__` that explicitly raises
   a :exc:`TypeError` would be incorrectly identified as hashable by
   an ``isinstance(obj, collections.abc.Hashable)`` call.


   .. note::

      By default, the :meth:`__hash__` values of str and bytes objects are
      "salted" with an unpredictable random value.  Although they
      remain constant within an individual Python process, they are not
      predictable between repeated invocations of Python.

      This is intended to provide protection against a denial-of-service caused
      by carefully chosen inputs that exploit the worst case performance of a
      dict insertion, *O*\ (*n*\ :sup:`2`) complexity.  See
      http://ocert.org/advisories/ocert-2011-003.html for details.

      Changing hash values affects the iteration order of sets.
      Python has never made guarantees about this ordering
      (and it typically varies between 32-bit and 64-bit builds).

      See also :envvar:`PYTHONHASHSEED`.

   .. versionchanged:: 3.3
      Hash randomization is enabled by default.


.. method:: object.__bool__(self)

   .. index:: single: __len__() (mapping object method)

   Called to implement truth value testing and the built-in operation
   ``bool()``; should return ``False`` or ``True``.  When this method is not
   defined, :meth:`~object.__len__` is called, if it is defined, and the object is
   considered true if its result is nonzero.  If a class defines neither
   :meth:`!__len__` nor :meth:`!__bool__` (which is true of the :class:`object`
   class itself), all its instances are considered true.


.. _attribute-access:

Customizing attribute access
----------------------------

The following methods can be defined to customize the meaning of attribute
access (use of, assignment to, or deletion of ``x.name``) for class instances.

.. XXX explain how descriptors interfere here!


.. method:: object.__getattr__(self, name)

   Called when the default attribute access fails with an :exc:`AttributeError`
   (either :meth:`__getattribute__` raises an :exc:`AttributeError` because
   *name* is not an instance attribute or an attribute in the class tree
   for ``self``; or :meth:`__get__` of a *name* property raises
   :exc:`AttributeError`).  This method should either return the (computed)
   attribute value or raise an :exc:`AttributeError` exception.
   The :class:`object` class itself does not provide this method.

   Note that if the attribute is found through the normal mechanism,
   :meth:`__getattr__` is not called.  (This is an intentional asymmetry between
   :meth:`__getattr__` and :meth:`__setattr__`.) This is done both for efficiency
   reasons and because otherwise :meth:`__getattr__` would have no way to access
   other attributes of the instance.  Note that at least for instance variables,
   you can take total control by not inserting any values in the instance attribute
   dictionary (but instead inserting them in another object).  See the
   :meth:`__getattribute__` method below for a way to actually get total control
   over attribute access.


.. method:: object.__getattribute__(self, name)

   Called unconditionally to implement attribute accesses for instances of the
   class. If the class also defines :meth:`__getattr__`, the latter will not be
   called unless :meth:`__getattribute__` either calls it explicitly or raises an
   :exc:`AttributeError`. This method should return the (computed) attribute value
   or raise an :exc:`AttributeError` exception. In order to avoid infinite
   recursion in this method, its implementation should always call the base class
   method with the same name to access any attributes it needs, for example,
   ``object.__getattribute__(self, name)``.

   .. note::

      This method may still be bypassed when looking up special methods as the
      result of implicit invocation via language syntax or
      :ref:`built-in functions <builtin-functions>`.
      See :ref:`special-lookup`.

   .. audit-event:: object.__getattr__ obj,name object.__getattribute__

      For certain sensitive attribute accesses, raises an
      :ref:`auditing event <auditing>` ``object.__getattr__`` with arguments
      ``obj`` and ``name``.


.. method:: object.__setattr__(self, name, value)

   Called when an attribute assignment is attempted.  This is called instead of
   the normal mechanism (i.e. store the value in the instance dictionary).
   *name* is the attribute name, *value* is the value to be assigned to it.

   If :meth:`__setattr__` wants to assign to an instance attribute, it should
   call the base class method with the same name, for example,
   ``object.__setattr__(self, name, value)``.

   .. audit-event:: object.__setattr__ obj,name,value object.__setattr__

      For certain sensitive attribute assignments, raises an
      :ref:`auditing event <auditing>` ``object.__setattr__`` with arguments
      ``obj``, ``name``, ``value``.


.. method:: object.__delattr__(self, name)

   Like :meth:`__setattr__` but for attribute deletion instead of assignment.  This
   should only be implemented if ``del obj.name`` is meaningful for the object.

   .. audit-event:: object.__delattr__ obj,name object.__delattr__

      For certain sensitive attribute deletions, raises an
      :ref:`auditing event <auditing>` ``object.__delattr__`` with arguments
      ``obj`` and ``name``.


.. method:: object.__dir__(self)

   Called when :func:`dir` is called on the object. An iterable must be
   returned. :func:`dir` converts the returned iterable to a list and sorts it.


Customizing module attribute access
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   single: __getattr__ (module attribute)
   single: __dir__ (module attribute)
   single: __class__ (module attribute)

Special names ``__getattr__`` and ``__dir__`` can be also used to customize
access to module attributes. The ``__getattr__`` function at the module level
should accept one argument which is the name of an attribute and return the
computed value or raise an :exc:`AttributeError`. If an attribute is
not found on a module object through the normal lookup, i.e.
:meth:`object.__getattribute__`, then ``__getattr__`` is searched in
the module ``__dict__`` before raising an :exc:`AttributeError`. If found,
it is called with the attribute name and the result is returned.

The ``__dir__`` function should accept no arguments, and return an iterable of
strings that represents the names accessible on module. If present, this
function overrides the standard :func:`dir` search on a module.

For a more fine grained customization of the module behavior (setting
attributes, properties, etc.), one can set the ``__class__`` attribute of
a module object to a subclass of :class:`types.ModuleType`. For example::

   import sys
   from types import ModuleType

   class VerboseModule(ModuleType):
       def __repr__(self):
           return f'Verbose {self.__name__}'

       def __setattr__(self, attr, value):
           print(f'Setting {attr}...')
           super().__setattr__(attr, value)

   sys.modules[__name__].__class__ = VerboseModule

.. note::
   Defining module ``__getattr__`` and setting module ``__class__`` only
   affect lookups made using the attribute access syntax -- directly accessing
   the module globals (whether by code within the module, or via a reference
   to the module's globals dictionary) is unaffected.

.. versionchanged:: 3.5
   ``__class__`` module attribute is now writable.

.. versionadded:: 3.7
   ``__getattr__`` and ``__dir__`` module attributes.

.. seealso::

   :pep:`562` - Module __getattr__ and __dir__
      Describes the ``__getattr__`` and ``__dir__`` functions on modules.


.. _descriptors:

Implementing Descriptors
^^^^^^^^^^^^^^^^^^^^^^^^

The following methods only apply when an instance of the class containing the
method (a so-called *descriptor* class) appears in an *owner* class (the
descriptor must be in either the owner's class dictionary or in the class
dictionary for one of its parents).  In the examples below, "the attribute"
refers to the attribute whose name is the key of the property in the owner
class' :attr:`~object.__dict__`.  The :class:`object` class itself does not
implement any of these protocols.

.. method:: object.__get__(self, instance, owner=None)

   Called to get the attribute of the owner class (class attribute access) or
   of an instance of that class (instance attribute access). The optional
   *owner* argument is the owner class, while *instance* is the instance that
   the attribute was accessed through, or ``None`` when the attribute is
   accessed through the *owner*.

   This method should return the computed attribute value or raise an
   :exc:`AttributeError` exception.

   :PEP:`252` specifies that :meth:`__get__` is callable with one or two
   arguments.  Python's own built-in descriptors support this specification;
   however, it is likely that some third-party tools have descriptors
   that require both arguments.  Python's own :meth:`__getattribute__`
   implementation always passes in both arguments whether they are required
   or not.

.. method:: object.__set__(self, instance, value)

   Called to set the attribute on an instance *instance* of the owner class to a
   new value, *value*.

   Note, adding :meth:`__set__` or :meth:`__delete__` changes the kind of
   descriptor to a "data descriptor".  See :ref:`descriptor-invocation` for
   more details.

.. method:: object.__delete__(self, instance)

   Called to delete the attribute on an instance *instance* of the owner class.

Instances of descriptors may also have the :attr:`!__objclass__` attribute
present:

.. attribute:: object.__objclass__

   The attribute :attr:`!__objclass__` is interpreted by the :mod:`inspect` module
   as specifying the class where this object was defined (setting this
   appropriately can assist in runtime introspection of dynamic class attributes).
   For callables, it may indicate that an instance of the given type (or a
   subclass) is expected or required as the first positional argument (for example,
   CPython sets this attribute for unbound methods that are implemented in C).


.. _descriptor-invocation:

Invoking Descriptors
^^^^^^^^^^^^^^^^^^^^

In general, a descriptor is an object attribute with "binding behavior", one
whose attribute access has been overridden by methods in the descriptor
protocol:  :meth:`~object.__get__`, :meth:`~object.__set__`, and
:meth:`~object.__delete__`. If any of
those methods are defined for an object, it is said to be a descriptor.

The default behavior for attribute access is to get, set, or delete the
attribute from an object's dictionary. For instance, ``a.x`` has a lookup chain
starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and
continuing through the base classes of ``type(a)`` excluding metaclasses.

However, if the looked-up value is an object defining one of the descriptor
methods, then Python may override the default behavior and invoke the descriptor
method instead.  Where this occurs in the precedence chain depends on which
descriptor methods were defined and how they were called.

The starting point for descriptor invocation is a binding, ``a.x``. How the
arguments are assembled depends on ``a``:

Direct Call
   The simplest and least common call is when user code directly invokes a
   descriptor method:    ``x.__get__(a)``.

Instance Binding
   If binding to an object instance, ``a.x`` is transformed into the call:
   ``type(a).__dict__['x'].__get__(a, type(a))``.

Class Binding
   If binding to a class, ``A.x`` is transformed into the call:
   ``A.__dict__['x'].__get__(None, A)``.

Super Binding
   A dotted lookup such as ``super(A, a).x`` searches
   ``a.__class__.__mro__`` for a base class ``B`` following ``A`` and then
   returns ``B.__dict__['x'].__get__(a, A)``.  If not a descriptor, ``x`` is
   returned unchanged.

.. testcode::
    :hide:

    class Desc:
        def __get__(*args):
            return args

    class B:

        x = Desc()

    class A(B):

        x = 999

        def m(self):
            'Demonstrate these two descriptor invocations are equivalent'
            result1 = super(A, self).x
            result2 = B.__dict__['x'].__get__(self, A)
            return result1 == result2

.. doctest::
    :hide:

    >>> a = A()
    >>> a.__class__.__mro__.index(B) > a.__class__.__mro__.index(A)
    True
    >>> super(A, a).x == B.__dict__['x'].__get__(a, A)
    True
    >>> a.m()
    True

For instance bindings, the precedence of descriptor invocation depends on
which descriptor methods are defined.  A descriptor can define any combination
of :meth:`~object.__get__`, :meth:`~object.__set__` and
:meth:`~object.__delete__`.  If it does not
define :meth:`!__get__`, then accessing the attribute will return the descriptor
object itself unless there is a value in the object's instance dictionary.  If
the descriptor defines :meth:`!__set__` and/or :meth:`!__delete__`, it is a data
descriptor; if it defines neither, it is a non-data descriptor.  Normally, data
descriptors define both :meth:`!__get__` and :meth:`!__set__`, while non-data
descriptors have just the :meth:`!__get__` method.  Data descriptors with
:meth:`!__get__` and :meth:`!__set__` (and/or :meth:`!__delete__`) defined
always override a redefinition in an
instance dictionary.  In contrast, non-data descriptors can be overridden by
instances.

Python methods (including those decorated with
:func:`@staticmethod <staticmethod>` and :func:`@classmethod <classmethod>`) are
implemented as non-data descriptors.  Accordingly, instances can redefine and
override methods.  This allows individual instances to acquire behaviors that
differ from other instances of the same class.

The :func:`property` function is implemented as a data descriptor. Accordingly,
instances cannot override the behavior of a property.


.. _slots:

__slots__
^^^^^^^^^

*__slots__* allow us to explicitly declare data members (like
properties) and deny the creation of :attr:`~object.__dict__` and *__weakref__*
(unless explicitly declared in *__slots__* or available in a parent.)

The space saved over using :attr:`~object.__dict__` can be significant.
Attribute lookup speed can be significantly improved as well.

.. data:: object.__slots__

   This class variable can be assigned a string, iterable, or sequence of
   strings with variable names used by instances.  *__slots__* reserves space
   for the declared variables and prevents the automatic creation of
   :attr:`~object.__dict__`
   and *__weakref__* for each instance.


.. _datamodel-note-slots:

Notes on using *__slots__*:

* When inheriting from a class without *__slots__*, the
  :attr:`~object.__dict__` and
  *__weakref__* attribute of the instances will always be accessible.

* Without a :attr:`~object.__dict__` variable, instances cannot be assigned new
  variables not
  listed in the *__slots__* definition.  Attempts to assign to an unlisted
  variable name raises :exc:`AttributeError`. If dynamic assignment of new
  variables is desired, then add ``'__dict__'`` to the sequence of strings in
  the *__slots__* declaration.

* Without a *__weakref__* variable for each instance, classes defining
  *__slots__* do not support :mod:`weak references <weakref>` to its instances.
  If weak reference
  support is needed, then add ``'__weakref__'`` to the sequence of strings in the
  *__slots__* declaration.

* *__slots__* are implemented at the class level by creating :ref:`descriptors <descriptors>`
  for each variable name.  As a result, class attributes
  cannot be used to set default values for instance variables defined by
  *__slots__*; otherwise, the class attribute would overwrite the descriptor
  assignment.

* The action of a *__slots__* declaration is not limited to the class
  where it is defined.  *__slots__* declared in parents are available in
  child classes. However, instances of a child subclass will get a
  :attr:`~object.__dict__` and *__weakref__* unless the subclass also defines
  *__slots__* (which should only contain names of any *additional* slots).

* If a class defines a slot also defined in a base class, the instance variable
  defined by the base class slot is inaccessible (except by retrieving its
  descriptor directly from the base class). This renders the meaning of the
  program undefined.  In the future, a check may be added to prevent this.

* :exc:`TypeError` will be raised if nonempty *__slots__* are defined for a
  class derived from a
  :c:member:`"variable-length" built-in type <PyTypeObject.tp_itemsize>` such as
  :class:`int`, :class:`bytes`, and :class:`tuple`.

* Any non-string :term:`iterable` may be assigned to *__slots__*.

* If a :class:`dictionary <dict>` is used to assign *__slots__*, the dictionary
  keys will be used as the slot names. The values of the dictionary can be used
  to provide per-attribute docstrings that will be recognised by
  :func:`inspect.getdoc` and displayed in the output of :func:`help`.

* :attr:`~object.__class__` assignment works only if both classes have the
  same *__slots__*.

* :ref:`Multiple inheritance <tut-multiple>` with multiple slotted parent
  classes can be used,
  but only one parent is allowed to have attributes created by slots
  (the other bases must have empty slot layouts) - violations raise
  :exc:`TypeError`.

* If an :term:`iterator` is used for *__slots__* then a :term:`descriptor` is
  created for each
  of the iterator's values. However, the *__slots__* attribute will be an empty
  iterator.

.. _class-customization:

Customizing class creation
--------------------------

Whenever a class inherits from another class, :meth:`~object.__init_subclass__` is
called on the parent class. This way, it is possible to write classes which
change the behavior of subclasses. This is closely related to class
decorators, but where class decorators only affect the specific class they're
applied to, ``__init_subclass__`` solely applies to future subclasses of the
class defining the method.

.. classmethod:: object.__init_subclass__(cls)

   This method is called whenever the containing class is subclassed.
   *cls* is then the new subclass. If defined as a normal instance method,
   this method is implicitly converted to a class method.

   Keyword arguments which are given to a new class are passed to
   the parent class's ``__init_subclass__``. For compatibility with
   other classes using ``__init_subclass__``, one should take out the
   needed keyword arguments and pass the others over to the base
   class, as in::

       class Philosopher:
           def __init_subclass__(cls, /, default_name, **kwargs):
               super().__init_subclass__(**kwargs)
               cls.default_name = default_name

       class AustralianPhilosopher(Philosopher, default_name="Bruce"):
           pass

   The default implementation ``object.__init_subclass__`` does
   nothing, but raises an error if it is called with any arguments.

   .. note::

      The metaclass hint ``metaclass`` is consumed by the rest of the type
      machinery, and is never passed to ``__init_subclass__`` implementations.
      The actual metaclass (rather than the explicit hint) can be accessed as
      ``type(cls)``.

   .. versionadded:: 3.6


When a class is created, :meth:`type.__new__` scans the class variables
and makes callbacks to those with a :meth:`~object.__set_name__` hook.

.. method:: object.__set_name__(self, owner, name)

   Automatically called at the time the owning class *owner* is
   created. The object has been assigned to *name* in that class::

       class A:
           x = C()  # Automatically calls: x.__set_name__(A, 'x')

   If the class variable is assigned after the class is created,
   :meth:`__set_name__` will not be called automatically.
   If needed, :meth:`__set_name__` can be called directly::

       class A:
          pass

       c = C()
       A.x = c                  # The hook is not called
       c.__set_name__(A, 'x')   # Manually invoke the hook

   See :ref:`class-object-creation` for more details.

   .. versionadded:: 3.6


.. _metaclasses:

Metaclasses
^^^^^^^^^^^

.. index::
   single: metaclass
   pair: built-in function; type
   single: = (equals); class definition

By default, classes are constructed using :func:`type`. The class body is
executed in a new namespace and the class name is bound locally to the
result of ``type(name, bases, namespace)``.

The class creation process can be customized by passing the ``metaclass``
keyword argument in the class definition line, or by inheriting from an
existing class that included such an argument. In the following example,
both ``MyClass`` and ``MySubclass`` are instances of ``Meta``::

   class Meta(type):
       pass

   class MyClass(metaclass=Meta):
       pass

   class MySubclass(MyClass):
       pass

Any other keyword arguments that are specified in the class definition are
passed through to all metaclass operations described below.

When a class definition is executed, the following steps occur:

* MRO entries are resolved;
* the appropriate metaclass is determined;
* the class namespace is prepared;
* the class body is executed;
* the class object is created.


Resolving MRO entries
^^^^^^^^^^^^^^^^^^^^^

.. method:: object.__mro_entries__(self, bases)

   If a base that appears in a class definition is not an instance of
   :class:`type`, then an :meth:`!__mro_entries__` method is searched on the base.
   If an :meth:`!__mro_entries__` method is found, the base is substituted with the
   result of a call to :meth:`!__mro_entries__` when creating the class.
   The method is called with the original bases tuple
   passed to the *bases* parameter, and must return a tuple
   of classes that will be used instead of the base. The returned tuple may be
   empty: in these cases, the original base is ignored.

.. seealso::

   :func:`types.resolve_bases`
      Dynamically resolve bases that are not instances of :class:`type`.

   :func:`types.get_original_bases`
      Retrieve a class's "original bases" prior to modifications by
      :meth:`~object.__mro_entries__`.

   :pep:`560`
      Core support for typing module and generic types.


Determining the appropriate metaclass
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. index::
    single: metaclass hint

The appropriate metaclass for a class definition is determined as follows:

* if no bases and no explicit metaclass are given, then :func:`type` is used;
* if an explicit metaclass is given and it is *not* an instance of
  :func:`type`, then it is used directly as the metaclass;
* if an instance of :func:`type` is given as the explicit metaclass, or
  bases are defined, then the most derived metaclass is used.

The most derived metaclass is selected from the explicitly specified
metaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all specified
base classes. The most derived metaclass is one which is a subtype of *all*
of these candidate metaclasses. If none of the candidate metaclasses meets
that criterion, then the class definition will fail with ``TypeError``.


.. _prepare:

Preparing the class namespace
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
    single: __prepare__ (metaclass method)

Once the appropriate metaclass has been identified, then the class namespace
is prepared. If the metaclass has a ``__prepare__`` attribute, it is called
as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the
additional keyword arguments, if any, come from the class definition). The
``__prepare__`` method should be implemented as a
:func:`classmethod <classmethod>`. The
namespace returned by ``__prepare__`` is passed in to ``__new__``, but when
the final class object is created the namespace is copied into a new ``dict``.

If the metaclass has no ``__prepare__`` attribute, then the class namespace
is initialised as an empty ordered mapping.

.. seealso::

   :pep:`3115` - Metaclasses in Python 3000
      Introduced the ``__prepare__`` namespace hook


Executing the class body
^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
    single: class; body

The class body is executed (approximately) as
``exec(body, globals(), namespace)``. The key difference from a normal
call to :func:`exec` is that lexical scoping allows the class body (including
any methods) to reference names from the current and outer scopes when the
class definition occurs inside a function.

However, even when the class definition occurs inside the function, methods
defined inside the class still cannot see names defined at the class scope.
Class variables must be accessed through the first parameter of instance or
class methods, or through the implicit lexically scoped ``__class__`` reference
described in the next section.

.. _class-object-creation:

Creating the class object
^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
    single: __class__ (method cell)
    single: __classcell__ (class namespace entry)


Once the class namespace has been populated by executing the class body,
the class object is created by calling
``metaclass(name, bases, namespace, **kwds)`` (the additional keywords
passed here are the same as those passed to ``__prepare__``).

This class object is the one that will be referenced by the zero-argument
form of :func:`super`. ``__class__`` is an implicit closure reference
created by the compiler if any methods in a class body refer to either
``__class__`` or ``super``. This allows the zero argument form of
:func:`super` to correctly identify the class being defined based on
lexical scoping, while the class or instance that was used to make the
current call is identified based on the first argument passed to the method.

.. impl-detail::

   In CPython 3.6 and later, the ``__class__`` cell is passed to the metaclass
   as a ``__classcell__`` entry in the class namespace. If present, this must
   be propagated up to the ``type.__new__`` call in order for the class to be
   initialised correctly.
   Failing to do so will result in a :exc:`RuntimeError` in Python 3.8.

When using the default metaclass :class:`type`, or any metaclass that ultimately
calls ``type.__new__``, the following additional customization steps are
invoked after creating the class object:

1) The ``type.__new__`` method collects all of the attributes in the class
   namespace that define a :meth:`~object.__set_name__` method;
2) Those ``__set_name__`` methods are called with the class
   being defined and the assigned name of that particular attribute;
3) The :meth:`~object.__init_subclass__` hook is called on the
   immediate parent of the new class in its method resolution order.

After the class object is created, it is passed to the class decorators
included in the class definition (if any) and the resulting object is bound
in the local namespace as the defined class.

When a new class is created by ``type.__new__``, the object provided as the
namespace parameter is copied to a new ordered mapping and the original
object is discarded. The new copy is wrapped in a read-only proxy, which
becomes the :attr:`~type.__dict__` attribute of the class object.

.. seealso::

   :pep:`3135` - New super
      Describes the implicit ``__class__`` closure reference


Uses for metaclasses
^^^^^^^^^^^^^^^^^^^^

The potential uses for metaclasses are boundless. Some ideas that have been
explored include enum, logging, interface checking, automatic delegation,
automatic property creation, proxies, frameworks, and automatic resource
locking/synchronization.


Customizing instance and subclass checks
----------------------------------------

The following methods are used to override the default behavior of the
:func:`isinstance` and :func:`issubclass` built-in functions.

In particular, the metaclass :class:`abc.ABCMeta` implements these methods in
order to allow the addition of Abstract Base Classes (ABCs) as "virtual base
classes" to any class or type (including built-in types), including other
ABCs.

.. method:: type.__instancecheck__(self, instance)

   Return true if *instance* should be considered a (direct or indirect)
   instance of *class*. If defined, called to implement ``isinstance(instance,
   class)``.


.. method:: type.__subclasscheck__(self, subclass)

   Return true if *subclass* should be considered a (direct or indirect)
   subclass of *class*.  If defined, called to implement ``issubclass(subclass,
   class)``.


Note that these methods are looked up on the type (metaclass) of a class.  They
cannot be defined as class methods in the actual class.  This is consistent with
the lookup of special methods that are called on instances, only in this
case the instance is itself a class.

.. seealso::

   :pep:`3119` - Introducing Abstract Base Classes
      Includes the specification for customizing :func:`isinstance` and
      :func:`issubclass` behavior through :meth:`~type.__instancecheck__` and
      :meth:`~type.__subclasscheck__`, with motivation for this functionality
      in the context of adding Abstract Base Classes (see the :mod:`abc`
      module) to the language.


Emulating generic types
-----------------------

When using :term:`type annotations<annotation>`, it is often useful to
*parameterize* a :term:`generic type` using Python's square-brackets notation.
For example, the annotation ``list[int]`` might be used to signify a
:class:`list` in which all the elements are of type :class:`int`.

.. seealso::

   :pep:`484` - Type Hints
      Introducing Python's framework for type annotations

   :ref:`Generic Alias Types<types-genericalias>`
      Documentation for objects representing parameterized generic classes

   :ref:`Generics`, :ref:`user-defined generics<user-defined-generics>` and :class:`typing.Generic`
      Documentation on how to implement generic classes that can be
      parameterized at runtime and understood by static type-checkers.

A class can *generally* only be parameterized if it defines the special
class method ``__class_getitem__()``.

.. classmethod:: object.__class_getitem__(cls, key)

   Return an object representing the specialization of a generic class
   by type arguments found in *key*.

   When defined on a class, ``__class_getitem__()`` is automatically a class
   method. As such, there is no need for it to be decorated with
   :func:`@classmethod<classmethod>` when it is defined.


The purpose of *__class_getitem__*
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The purpose of :meth:`~object.__class_getitem__` is to allow runtime
parameterization of standard-library generic classes in order to more easily
apply :term:`type hints<type hint>` to these classes.

To implement custom generic classes that can be parameterized at runtime and
understood by static type-checkers, users should either inherit from a standard
library class that already implements :meth:`~object.__class_getitem__`, or
inherit from :class:`typing.Generic`, which has its own implementation of
``__class_getitem__()``.

Custom implementations of :meth:`~object.__class_getitem__` on classes defined
outside of the standard library may not be understood by third-party
type-checkers such as mypy. Using ``__class_getitem__()`` on any class for
purposes other than type hinting is discouraged.


.. _classgetitem-versus-getitem:


*__class_getitem__* versus *__getitem__*
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Usually, the :ref:`subscription<subscriptions>` of an object using square
brackets will call the :meth:`~object.__getitem__` instance method defined on
the object's class. However, if the object being subscribed is itself a class,
the class method :meth:`~object.__class_getitem__` may be called instead.
``__class_getitem__()`` should return a :ref:`GenericAlias<types-genericalias>`
object if it is properly defined.

Presented with the :term:`expression` ``obj[x]``, the Python interpreter
follows something like the following process to decide whether
:meth:`~object.__getitem__` or :meth:`~object.__class_getitem__` should be
called::

   from inspect import isclass

   def subscribe(obj, x):
       """Return the result of the expression 'obj[x]'"""

       class_of_obj = type(obj)

       # If the class of obj defines __getitem__,
       # call class_of_obj.__getitem__(obj, x)
       if hasattr(class_of_obj, '__getitem__'):
           return class_of_obj.__getitem__(obj, x)

       # Else, if obj is a class and defines __class_getitem__,
       # call obj.__class_getitem__(x)
       elif isclass(obj) and hasattr(obj, '__class_getitem__'):
           return obj.__class_getitem__(x)

       # Else, raise an exception
       else:
           raise TypeError(
               f"'{class_of_obj.__name__}' object is not subscriptable"
           )

In Python, all classes are themselves instances of other classes. The class of
a class is known as that class's :term:`metaclass`, and most classes have the
:class:`type` class as their metaclass. :class:`type` does not define
:meth:`~object.__getitem__`, meaning that expressions such as ``list[int]``,
``dict[str, float]`` and ``tuple[str, bytes]`` all result in
:meth:`~object.__class_getitem__` being called::

   >>> # list has class "type" as its metaclass, like most classes:
   >>> type(list)
   <class 'type'>
   >>> type(dict) == type(list) == type(tuple) == type(str) == type(bytes)
   True
   >>> # "list[int]" calls "list.__class_getitem__(int)"
   >>> list[int]
   list[int]
   >>> # list.__class_getitem__ returns a GenericAlias object:
   >>> type(list[int])
   <class 'types.GenericAlias'>

However, if a class has a custom metaclass that defines
:meth:`~object.__getitem__`, subscribing the class may result in different
behaviour. An example of this can be found in the :mod:`enum` module::

   >>> from enum import Enum
   >>> class Menu(Enum):
   ...     """A breakfast menu"""
   ...     SPAM = 'spam'
   ...     BACON = 'bacon'
   ...
   >>> # Enum classes have a custom metaclass:
   >>> type(Menu)
   <class 'enum.EnumMeta'>
   >>> # EnumMeta defines __getitem__,
   >>> # so __class_getitem__ is not called,
   >>> # and the result is not a GenericAlias object:
   >>> Menu['SPAM']
   <Menu.SPAM: 'spam'>
   >>> type(Menu['SPAM'])
   <enum 'Menu'>


.. seealso::
   :pep:`560` - Core Support for typing module and generic types
      Introducing :meth:`~object.__class_getitem__`, and outlining when a
      :ref:`subscription<subscriptions>` results in ``__class_getitem__()``
      being called instead of :meth:`~object.__getitem__`


.. _callable-types:

Emulating callable objects
--------------------------


.. method:: object.__call__(self[, args...])

   .. index:: pair: call; instance

   Called when the instance is "called" as a function; if this method is defined,
   ``x(arg1, arg2, ...)`` roughly translates to ``type(x).__call__(x, arg1, ...)``.
   The :class:`object` class itself does not provide this method.


.. _sequence-types:

Emulating container types
-------------------------

The following methods can be defined to implement container objects. None of them
are provided by the :class:`object` class itself. Containers usually are
:term:`sequences <sequence>` (such as :class:`lists <list>` or
:class:`tuples <tuple>`) or :term:`mappings <mapping>` (like
:term:`dictionaries <dictionary>`),
but can represent other containers as well.  The first set of methods is used
either to emulate a sequence or to emulate a mapping; the difference is that for
a sequence, the allowable keys should be the integers *k* for which ``0 <= k <
N`` where *N* is the length of the sequence, or :class:`slice` objects, which define a
range of items.  It is also recommended that mappings provide the methods
:meth:`!keys`, :meth:`!values`, :meth:`!items`, :meth:`!get`, :meth:`!clear`,
:meth:`!setdefault`, :meth:`!pop`, :meth:`!popitem`, :meth:`!copy`, and
:meth:`!update` behaving similar to those for Python's standard :class:`dictionary <dict>`
objects.  The :mod:`collections.abc` module provides a
:class:`~collections.abc.MutableMapping`
:term:`abstract base class` to help create those methods from a base set of
:meth:`~object.__getitem__`, :meth:`~object.__setitem__`,
:meth:`~object.__delitem__`, and :meth:`!keys`.
Mutable sequences should provide methods :meth:`!append`, :meth:`!count`,
:meth:`!index`, :meth:`!extend`, :meth:`!insert`, :meth:`!pop`, :meth:`!remove`,
:meth:`!reverse` and :meth:`!sort`, like Python standard :class:`list`
objects. Finally,
sequence types should implement addition (meaning concatenation) and
multiplication (meaning repetition) by defining the methods
:meth:`~object.__add__`, :meth:`~object.__radd__`, :meth:`~object.__iadd__`,
:meth:`~object.__mul__`, :meth:`~object.__rmul__` and :meth:`~object.__imul__`
described below; they should not define other numerical
operators.  It is recommended that both mappings and sequences implement the
:meth:`~object.__contains__` method to allow efficient use of the ``in``
operator; for
mappings, ``in`` should search the mapping's keys; for sequences, it should
search through the values.  It is further recommended that both mappings and
sequences implement the :meth:`~object.__iter__` method to allow efficient iteration
through the container; for mappings, :meth:`!__iter__` should iterate
through the object's keys; for sequences, it should iterate through the values.

.. method:: object.__len__(self)

   .. index::
      pair: built-in function; len
      single: __bool__() (object method)

   Called to implement the built-in function :func:`len`.  Should return the length
   of the object, an integer ``>=`` 0.  Also, an object that doesn't define a
   :meth:`~object.__bool__` method and whose :meth:`!__len__` method returns zero is
   considered to be false in a Boolean context.

   .. impl-detail::

      In CPython, the length is required to be at most :data:`sys.maxsize`.
      If the length is larger than :data:`!sys.maxsize` some features (such as
      :func:`len`) may raise :exc:`OverflowError`.  To prevent raising
      :exc:`!OverflowError` by truth value testing, an object must define a
      :meth:`~object.__bool__` method.


.. method:: object.__length_hint__(self)

   Called to implement :func:`operator.length_hint`. Should return an estimated
   length for the object (which may be greater or less than the actual length).
   The length must be an integer ``>=`` 0. The return value may also be
   :data:`NotImplemented`, which is treated the same as if the
   ``__length_hint__`` method didn't exist at all. This method is purely an
   optimization and is never required for correctness.

   .. versionadded:: 3.4


.. index:: pair: object; slice

.. note::

   Slicing is done exclusively with the following three methods.  A call like ::

      a[1:2] = b

   is translated to ::

      a[slice(1, 2, None)] = b

   and so forth.  Missing slice items are always filled in with ``None``.


.. method:: object.__getitem__(self, key)

   Called to implement evaluation of ``self[key]``. For :term:`sequence` types,
   the accepted keys should be integers. Optionally, they may support
   :class:`slice` objects as well.  Negative index support is also optional.
   If *key* is
   of an inappropriate type, :exc:`TypeError` may be raised; if *key* is a value
   outside the set of indexes for the sequence (after any special
   interpretation of negative values), :exc:`IndexError` should be raised. For
   :term:`mapping` types, if *key* is missing (not in the container),
   :exc:`KeyError` should be raised.

   .. note::

      :keyword:`for` loops expect that an :exc:`IndexError` will be raised for
      illegal indexes to allow proper detection of the end of the sequence.

   .. note::

      When :ref:`subscripting<subscriptions>` a *class*, the special
      class method :meth:`~object.__class_getitem__` may be called instead of
      ``__getitem__()``. See :ref:`classgetitem-versus-getitem` for more
      details.


.. method:: object.__setitem__(self, key, value)

   Called to implement assignment to ``self[key]``.  Same note as for
   :meth:`__getitem__`.  This should only be implemented for mappings if the
   objects support changes to the values for keys, or if new keys can be added, or
   for sequences if elements can be replaced.  The same exceptions should be raised
   for improper *key* values as for the :meth:`__getitem__` method.


.. method:: object.__delitem__(self, key)

   Called to implement deletion of ``self[key]``.  Same note as for
   :meth:`__getitem__`.  This should only be implemented for mappings if the
   objects support removal of keys, or for sequences if elements can be removed
   from the sequence.  The same exceptions should be raised for improper *key*
   values as for the :meth:`__getitem__` method.


.. method:: object.__missing__(self, key)

   Called by :class:`dict`\ .\ :meth:`__getitem__` to implement ``self[key]`` for dict subclasses
   when key is not in the dictionary.


.. method:: object.__iter__(self)

   This method is called when an :term:`iterator` is required for a container.
   This method should return a new iterator object that can iterate over all the
   objects in the container.  For mappings, it should iterate over the keys of
   the container.


.. method:: object.__reversed__(self)

   Called (if present) by the :func:`reversed` built-in to implement
   reverse iteration.  It should return a new iterator object that iterates
   over all the objects in the container in reverse order.

   If the :meth:`__reversed__` method is not provided, the :func:`reversed`
   built-in will fall back to using the sequence protocol (:meth:`__len__` and
   :meth:`__getitem__`).  Objects that support the sequence protocol should
   only provide :meth:`__reversed__` if they can provide an implementation
   that is more efficient than the one provided by :func:`reversed`.


The membership test operators (:keyword:`in` and :keyword:`not in`) are normally
implemented as an iteration through a container. However, container objects can
supply the following special method with a more efficient implementation, which
also does not require the object be iterable.

.. method:: object.__contains__(self, item)

   Called to implement membership test operators.  Should return true if *item*
   is in *self*, false otherwise.  For mapping objects, this should consider the
   keys of the mapping rather than the values or the key-item pairs.

   For objects that don't define :meth:`__contains__`, the membership test first
   tries iteration via :meth:`__iter__`, then the old sequence iteration
   protocol via :meth:`__getitem__`, see :ref:`this section in the language
   reference <membership-test-details>`.


.. _numeric-types:

Emulating numeric types
-----------------------

The following methods can be defined to emulate numeric objects. Methods
corresponding to operations that are not supported by the particular kind of
number implemented (e.g., bitwise operations for non-integral numbers) should be
left undefined.


.. method:: object.__add__(self, other)
            object.__sub__(self, other)
            object.__mul__(self, other)
            object.__matmul__(self, other)
            object.__truediv__(self, other)
            object.__floordiv__(self, other)
            object.__mod__(self, other)
            object.__divmod__(self, other)
            object.__pow__(self, other[, modulo])
            object.__lshift__(self, other)
            object.__rshift__(self, other)
            object.__and__(self, other)
            object.__xor__(self, other)
            object.__or__(self, other)

   .. index::
      pair: built-in function; divmod
      pair: built-in function; pow
      pair: built-in function; pow

   These methods are called to implement the binary arithmetic operations
   (``+``, ``-``, ``*``, ``@``, ``/``, ``//``, ``%``, :func:`divmod`,
   :func:`pow`, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``).  For instance, to
   evaluate the expression ``x + y``, where *x* is an instance of a class that
   has an :meth:`__add__` method, ``type(x).__add__(x, y)`` is called.  The
   :meth:`__divmod__` method should be the equivalent to using
   :meth:`__floordiv__` and :meth:`__mod__`; it should not be related to
   :meth:`__truediv__`.  Note that :meth:`__pow__` should be defined to accept
   an optional third argument if the three-argument version of the built-in :func:`pow`
   function is to be supported.

   If one of those methods does not support the operation with the supplied
   arguments, it should return :data:`NotImplemented`.


.. method:: object.__radd__(self, other)
            object.__rsub__(self, other)
            object.__rmul__(self, other)
            object.__rmatmul__(self, other)
            object.__rtruediv__(self, other)
            object.__rfloordiv__(self, other)
            object.__rmod__(self, other)
            object.__rdivmod__(self, other)
            object.__rpow__(self, other[, modulo])
            object.__rlshift__(self, other)
            object.__rrshift__(self, other)
            object.__rand__(self, other)
            object.__rxor__(self, other)
            object.__ror__(self, other)

   .. index::
      pair: built-in function; divmod
      pair: built-in function; pow

   These methods are called to implement the binary arithmetic operations
   (``+``, ``-``, ``*``, ``@``, ``/``, ``//``, ``%``, :func:`divmod`,
   :func:`pow`, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with reflected
   (swapped) operands.  These functions are only called if the operands
   are of different types, when the left operand does not support the corresponding
   operation [#]_, or the right operand's class is derived from the left operand's
   class. [#]_ For instance, to evaluate the expression ``x - y``, where *y* is
   an instance of a class that has an :meth:`__rsub__` method, ``type(y).__rsub__(y, x)``
   is called if ``type(x).__sub__(x, y)`` returns :data:`NotImplemented` or ``type(y)``
   is a subclass of ``type(x)``. [#]_

   Note that :meth:`__rpow__` should be defined to accept an optional third
   argument if the three-argument version of the built-in :func:`pow` function
   is to be supported.

   .. versionchanged:: next

      Three-argument :func:`pow` now try calling :meth:`~object.__rpow__` if necessary.
      Previously it was only called in two-argument :func:`!pow` and the binary
      power operator.

   .. note::

      If the right operand's type is a subclass of the left operand's type and
      that subclass provides a different implementation of the reflected method
      for the operation, this method will be called before the left operand's
      non-reflected method. This behavior allows subclasses to override their
      ancestors' operations.

.. method:: object.__iadd__(self, other)
            object.__isub__(self, other)
            object.__imul__(self, other)
            object.__imatmul__(self, other)
            object.__itruediv__(self, other)
            object.__ifloordiv__(self, other)
            object.__imod__(self, other)
            object.__ipow__(self, other[, modulo])
            object.__ilshift__(self, other)
            object.__irshift__(self, other)
            object.__iand__(self, other)
            object.__ixor__(self, other)
            object.__ior__(self, other)

   These methods are called to implement the augmented arithmetic assignments
   (``+=``, ``-=``, ``*=``, ``@=``, ``/=``, ``//=``, ``%=``, ``**=``, ``<<=``,
   ``>>=``, ``&=``, ``^=``, ``|=``).  These methods should attempt to do the
   operation in-place (modifying *self*) and return the result (which could be,
   but does not have to be, *self*).  If a specific method is not defined, or if
   that method returns :data:`NotImplemented`, the
   augmented assignment falls back to the normal methods.  For instance, if *x*
   is an instance of a class with an :meth:`__iadd__` method, ``x += y`` is
   equivalent to ``x = x.__iadd__(y)`` . If :meth:`__iadd__` does not exist, or if ``x.__iadd__(y)``
   returns :data:`!NotImplemented`, ``x.__add__(y)`` and
   ``y.__radd__(x)`` are considered, as with the evaluation of ``x + y``. In
   certain situations, augmented assignment can result in unexpected errors (see
   :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in fact
   part of the data model.


.. method:: object.__neg__(self)
            object.__pos__(self)
            object.__abs__(self)
            object.__invert__(self)

   .. index:: pair: built-in function; abs

   Called to implement the unary arithmetic operations (``-``, ``+``, :func:`abs`
   and ``~``).


.. method:: object.__complex__(self)
            object.__int__(self)
            object.__float__(self)

   .. index::
      pair: built-in function; complex
      pair: built-in function; int
      pair: built-in function; float

   Called to implement the built-in functions :func:`complex`,
   :func:`int` and :func:`float`.  Should return a value
   of the appropriate type.


.. method:: object.__index__(self)

   Called to implement :func:`operator.index`, and whenever Python needs to
   losslessly convert the numeric object to an integer object (such as in
   slicing, or in the built-in :func:`bin`, :func:`hex` and :func:`oct`
   functions). Presence of this method indicates that the numeric object is
   an integer type.  Must return an integer.

   If :meth:`__int__`, :meth:`__float__` and :meth:`__complex__` are not
   defined then corresponding built-in functions :func:`int`, :func:`float`
   and :func:`complex` fall back to :meth:`__index__`.


.. method:: object.__round__(self, [,ndigits])
            object.__trunc__(self)
            object.__floor__(self)
            object.__ceil__(self)

   .. index:: pair: built-in function; round

   Called to implement the built-in function :func:`round` and :mod:`math`
   functions :func:`~math.trunc`, :func:`~math.floor` and :func:`~math.ceil`.
   Unless *ndigits* is passed to :meth:`!__round__` all these methods should
   return the value of the object truncated to an :class:`~numbers.Integral`
   (typically an :class:`int`).

   .. versionchanged:: 3.14
      :func:`int` no longer delegates to the :meth:`~object.__trunc__` method.


.. _context-managers:

With Statement Context Managers
-------------------------------

A :dfn:`context manager` is an object that defines the runtime context to be
established when executing a :keyword:`with` statement. The context manager
handles the entry into, and the exit from, the desired runtime context for the
execution of the block of code.  Context managers are normally invoked using the
:keyword:`!with` statement (described in section :ref:`with`), but can also be
used by directly invoking their methods.

.. index::
   pair: statement; with
   single: context manager

Typical uses of context managers include saving and restoring various kinds of
global state, locking and unlocking resources, closing opened files, etc.

For more information on context managers, see :ref:`typecontextmanager`.
The :class:`object` class itself does not provide the context manager methods.


.. method:: object.__enter__(self)

   Enter the runtime context related to this object. The :keyword:`with` statement
   will bind this method's return value to the target(s) specified in the
   :keyword:`!as` clause of the statement, if any.


.. method:: object.__exit__(self, exc_type, exc_value, traceback)

   Exit the runtime context related to this object. The parameters describe the
   exception that caused the context to be exited. If the context was exited
   without an exception, all three arguments will be :const:`None`.

   If an exception is supplied, and the method wishes to suppress the exception
   (i.e., prevent it from being propagated), it should return a true value.
   Otherwise, the exception will be processed normally upon exit from this method.

   Note that :meth:`~object.__exit__` methods should not reraise the passed-in exception;
   this is the caller's responsibility.


.. seealso::

   :pep:`343` - The "with" statement
      The specification, background, and examples for the Python :keyword:`with`
      statement.


.. _class-pattern-matching:

Customizing positional arguments in class pattern matching
----------------------------------------------------------

When using a class name in a pattern, positional arguments in the pattern are not
allowed by default, i.e. ``case MyClass(x, y)`` is typically invalid without special
support in ``MyClass``. To be able to use that kind of pattern, the class needs to
define a *__match_args__* attribute.

.. data:: object.__match_args__

   This class variable can be assigned a tuple of strings. When this class is
   used in a class pattern with positional arguments, each positional argument will
   be converted into a keyword argument, using the corresponding value in
   *__match_args__* as the keyword. The absence of this attribute is equivalent to
   setting it to ``()``.

For example, if ``MyClass.__match_args__`` is ``("left", "center", "right")`` that means
that ``case MyClass(x, y)`` is equivalent to ``case MyClass(left=x, center=y)``. Note
that the number of arguments in the pattern must be smaller than or equal to the number
of elements in *__match_args__*; if it is larger, the pattern match attempt will raise
a :exc:`TypeError`.

.. versionadded:: 3.10

.. seealso::

   :pep:`634` - Structural Pattern Matching
      The specification for the Python ``match`` statement.


.. _python-buffer-protocol:

Emulating buffer types
----------------------

The :ref:`buffer protocol <bufferobjects>` provides a way for Python
objects to expose efficient access to a low-level memory array. This protocol
is implemented by builtin types such as :class:`bytes` and :class:`memoryview`,
and third-party libraries may define additional buffer types.

While buffer types are usually implemented in C, it is also possible to
implement the protocol in Python.

.. method:: object.__buffer__(self, flags)

   Called when a buffer is requested from *self* (for example, by the
   :class:`memoryview` constructor). The *flags* argument is an integer
   representing the kind of buffer requested, affecting for example whether
   the returned buffer is read-only or writable. :class:`inspect.BufferFlags`
   provides a convenient way to interpret the flags. The method must return
   a :class:`memoryview` object.

.. method:: object.__release_buffer__(self, buffer)

   Called when a buffer is no longer needed. The *buffer* argument is a
   :class:`memoryview` object that was previously returned by
   :meth:`~object.__buffer__`. The method must release any resources associated
   with the buffer. This method should return ``None``.
   Buffer objects that do not need to perform any cleanup are not required
   to implement this method.

.. versionadded:: 3.12

.. seealso::

   :pep:`688` - Making the buffer protocol accessible in Python
      Introduces the Python ``__buffer__`` and ``__release_buffer__`` methods.

   :class:`collections.abc.Buffer`
      ABC for buffer types.

Annotations
-----------

Functions, classes, and modules may contain :term:`annotations <annotation>`,
which are a way to associate information (usually :term:`type hints <type hint>`)
with a symbol.

.. attribute:: object.__annotations__

   This attribute contains the annotations for an object. It is
   :ref:`lazily evaluated <lazy-evaluation>`, so accessing the attribute may
   execute arbitrary code and raise exceptions. If evaluation is successful, the
   attribute is set to a dictionary mapping from variable names to annotations.

   .. versionchanged:: 3.14
      Annotations are now lazily evaluated.

.. method:: object.__annotate__(format)

   An :term:`annotate function`.
   Returns a new dictionary object mapping attribute/parameter names to their annotation values.

   Takes a format parameter specifying the format in which annotations values should be provided.
   It must be a member of the :class:`annotationlib.Format` enum, or an integer with
   a value corresponding to a member of the enum.

   If an annotate function doesn't support the requested format, it must raise
   :exc:`NotImplementedError`. Annotate functions must always support
   :attr:`~annotationlib.Format.VALUE` format; they must not raise
   :exc:`NotImplementedError()` when called with this format.

   When called with  :attr:`~annotationlib.Format.VALUE` format, an annotate function may raise
   :exc:`NameError`; it must not raise :exc:`!NameError` when called requesting any other format.

   If an object does not have any annotations, :attr:`~object.__annotate__` should preferably be set
   to ``None`` (it can’t be deleted), rather than set to a function that returns an empty dict.

   .. versionadded:: 3.14

.. seealso::

   :pep:`649` --- Deferred evaluation of annotation using descriptors
      Introduces lazy evaluation of annotations and the ``__annotate__`` function.


.. _special-lookup:

Special method lookup
---------------------

For custom classes, implicit invocations of special methods are only guaranteed
to work correctly if defined on an object's type, not in the object's instance
dictionary.  That behaviour is the reason why the following code raises an
exception::

   >>> class C:
   ...     pass
   ...
   >>> c = C()
   >>> c.__len__ = lambda: 5
   >>> len(c)
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: object of type 'C' has no len()

The rationale behind this behaviour lies with a number of special methods such
as :meth:`~object.__hash__` and :meth:`~object.__repr__` that are implemented
by all objects,
including type objects. If the implicit lookup of these methods used the
conventional lookup process, they would fail when invoked on the type object
itself::

   >>> 1 .__hash__() == hash(1)
   True
   >>> int.__hash__() == hash(int)
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: descriptor '__hash__' of 'int' object needs an argument

Incorrectly attempting to invoke an unbound method of a class in this way is
sometimes referred to as 'metaclass confusion', and is avoided by bypassing
the instance when looking up special methods::

   >>> type(1).__hash__(1) == hash(1)
   True
   >>> type(int).__hash__(int) == hash(int)
   True

In addition to bypassing any instance attributes in the interest of
correctness, implicit special method lookup generally also bypasses the
:meth:`~object.__getattribute__` method even of the object's metaclass::

   >>> class Meta(type):
   ...     def __getattribute__(*args):
   ...         print("Metaclass getattribute invoked")
   ...         return type.__getattribute__(*args)
   ...
   >>> class C(object, metaclass=Meta):
   ...     def __len__(self):
   ...         return 10
   ...     def __getattribute__(*args):
   ...         print("Class getattribute invoked")
   ...         return object.__getattribute__(*args)
   ...
   >>> c = C()
   >>> c.__len__()                 # Explicit lookup via instance
   Class getattribute invoked
   10
   >>> type(c).__len__(c)          # Explicit lookup via type
   Metaclass getattribute invoked
   10
   >>> len(c)                      # Implicit lookup
   10

Bypassing the :meth:`~object.__getattribute__` machinery in this fashion
provides significant scope for speed optimisations within the
interpreter, at the cost of some flexibility in the handling of
special methods (the special method *must* be set on the class
object itself in order to be consistently invoked by the interpreter).


.. index::
   single: coroutine

Coroutines
==========


Awaitable Objects
-----------------

An :term:`awaitable` object generally implements an :meth:`~object.__await__` method.
:term:`Coroutine objects <coroutine>` returned from :keyword:`async def` functions
are awaitable.

.. note::

   The :term:`generator iterator` objects returned from generators
   decorated with :func:`types.coroutine`
   are also awaitable, but they do not implement :meth:`~object.__await__`.

.. method:: object.__await__(self)

   Must return an :term:`iterator`.  Should be used to implement
   :term:`awaitable` objects.  For instance, :class:`asyncio.Future` implements
   this method to be compatible with the :keyword:`await` expression.
   The :class:`object` class itself is not awaitable and does not provide
   this method.

   .. note::

      The language doesn't place any restriction on the type or value of the
      objects yielded by the iterator returned by ``__await__``, as this is
      specific to the implementation of the asynchronous execution framework
      (e.g. :mod:`asyncio`) that will be managing the :term:`awaitable` object.


.. versionadded:: 3.5

.. seealso:: :pep:`492` for additional information about awaitable objects.


.. _coroutine-objects:

Coroutine Objects
-----------------

:term:`Coroutine objects <coroutine>` are :term:`awaitable` objects.
A coroutine's execution can be controlled by calling :meth:`~object.__await__` and
iterating over the result.  When the coroutine has finished executing and
returns, the iterator raises :exc:`StopIteration`, and the exception's
:attr:`~StopIteration.value` attribute holds the return value.  If the
coroutine raises an exception, it is propagated by the iterator.  Coroutines
should not directly raise unhandled :exc:`StopIteration` exceptions.

Coroutines also have the methods listed below, which are analogous to
those of generators (see :ref:`generator-methods`).  However, unlike
generators, coroutines do not directly support iteration.

.. versionchanged:: 3.5.2
   It is a :exc:`RuntimeError` to await on a coroutine more than once.


.. method:: coroutine.send(value)

   Starts or resumes execution of the coroutine.  If *value* is ``None``,
   this is equivalent to advancing the iterator returned by
   :meth:`~object.__await__`.  If *value* is not ``None``, this method delegates
   to the :meth:`~generator.send` method of the iterator that caused
   the coroutine to suspend.  The result (return value,
   :exc:`StopIteration`, or other exception) is the same as when
   iterating over the :meth:`!__await__` return value, described above.

.. method:: coroutine.throw(value)
            coroutine.throw(type[, value[, traceback]])

   Raises the specified exception in the coroutine.  This method delegates
   to the :meth:`~generator.throw` method of the iterator that caused
   the coroutine to suspend, if it has such a method.  Otherwise,
   the exception is raised at the suspension point.  The result
   (return value, :exc:`StopIteration`, or other exception) is the same as
   when iterating over the :meth:`~object.__await__` return value, described
   above.  If the exception is not caught in the coroutine, it propagates
   back to the caller.

   .. versionchanged:: 3.12

      The second signature \(type\[, value\[, traceback\]\]\) is deprecated and
      may be removed in a future version of Python.

.. method:: coroutine.close()

   Causes the coroutine to clean itself up and exit.  If the coroutine
   is suspended, this method first delegates to the :meth:`~generator.close`
   method of the iterator that caused the coroutine to suspend, if it
   has such a method.  Then it raises :exc:`GeneratorExit` at the
   suspension point, causing the coroutine to immediately clean itself up.
   Finally, the coroutine is marked as having finished executing, even if
   it was never started.

   Coroutine objects are automatically closed using the above process when
   they are about to be destroyed.

.. _async-iterators:

Asynchronous Iterators
----------------------

An *asynchronous iterator* can call asynchronous code in
its ``__anext__`` method.

Asynchronous iterators can be used in an :keyword:`async for` statement.

The :class:`object` class itself does not provide these methods.


.. method:: object.__aiter__(self)

   Must return an *asynchronous iterator* object.

.. method:: object.__anext__(self)

   Must return an *awaitable* resulting in a next value of the iterator.  Should
   raise a :exc:`StopAsyncIteration` error when the iteration is over.

An example of an asynchronous iterable object::

    class Reader:
        async def readline(self):
            ...

        def __aiter__(self):
            return self

        async def __anext__(self):
            val = await self.readline()
            if val == b'':
                raise StopAsyncIteration
            return val

.. versionadded:: 3.5

.. versionchanged:: 3.7
   Prior to Python 3.7, :meth:`~object.__aiter__` could return an *awaitable*
   that would resolve to an
   :term:`asynchronous iterator <asynchronous iterator>`.

   Starting with Python 3.7, :meth:`~object.__aiter__` must return an
   asynchronous iterator object.  Returning anything else
   will result in a :exc:`TypeError` error.


.. _async-context-managers:

Asynchronous Context Managers
-----------------------------

An *asynchronous context manager* is a *context manager* that is able to
suspend execution in its ``__aenter__`` and ``__aexit__`` methods.

Asynchronous context managers can be used in an :keyword:`async with` statement.

The :class:`object` class itself does not provide these methods.

.. method:: object.__aenter__(self)

   Semantically similar to :meth:`~object.__enter__`, the only
   difference being that it must return an *awaitable*.

.. method:: object.__aexit__(self, exc_type, exc_value, traceback)

   Semantically similar to :meth:`~object.__exit__`, the only
   difference being that it must return an *awaitable*.

An example of an asynchronous context manager class::

    class AsyncContextManager:
        async def __aenter__(self):
            await log('entering context')

        async def __aexit__(self, exc_type, exc, tb):
            await log('exiting context')

.. versionadded:: 3.5


.. rubric:: Footnotes

.. [#] It *is* possible in some cases to change an object's type, under certain
   controlled conditions. It generally isn't a good idea though, since it can
   lead to some very strange behaviour if it is handled incorrectly.

.. [#] The :meth:`~object.__hash__`, :meth:`~object.__iter__`,
   :meth:`~object.__reversed__`, :meth:`~object.__contains__`,
   :meth:`~object.__class_getitem__` and :meth:`~os.PathLike.__fspath__`
   methods have special handling for this. Others
   will still raise a :exc:`TypeError`, but may do so by relying on
   the behavior that ``None`` is not callable.

.. [#] "Does not support" here means that the class has no such method, or
   the method returns :data:`NotImplemented`.  Do not set the method to
   ``None`` if you want to force fallback to the right operand's reflected
   method—that will instead have the opposite effect of explicitly
   *blocking* such fallback.

.. [#] For operands of the same type, it is assumed that if the non-reflected method
   (such as :meth:`~object.__add__`) fails then the operation is not supported, which is why the
   reflected method is not called.

.. [#] If the right operand's type is a subclass of the left operand's type, the
   reflected method having precedence allows subclasses to override their ancestors'
   operations.
