mirror of https://github.com/python/cpython
docs: fix over-linking in dataclasses.rst (#117005)
This commit is contained in:
parent
570a82d46a
commit
0907871d43
|
@ -1,5 +1,5 @@
|
||||||
:mod:`dataclasses` --- Data Classes
|
:mod:`!dataclasses` --- Data Classes
|
||||||
===================================
|
====================================
|
||||||
|
|
||||||
.. module:: dataclasses
|
.. module:: dataclasses
|
||||||
:synopsis: Generate special methods on user-defined classes.
|
:synopsis: Generate special methods on user-defined classes.
|
||||||
|
@ -31,7 +31,7 @@ using :pep:`526` type annotations. For example, this code::
|
||||||
def total_cost(self) -> float:
|
def total_cost(self) -> float:
|
||||||
return self.unit_price * self.quantity_on_hand
|
return self.unit_price * self.quantity_on_hand
|
||||||
|
|
||||||
will add, among other things, a :meth:`~object.__init__` that looks like::
|
will add, among other things, a :meth:`!__init__` that looks like::
|
||||||
|
|
||||||
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
|
def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
@ -49,26 +49,26 @@ Module contents
|
||||||
.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False)
|
.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False)
|
||||||
|
|
||||||
This function is a :term:`decorator` that is used to add generated
|
This function is a :term:`decorator` that is used to add generated
|
||||||
:term:`special method`\s to classes, as described below.
|
:term:`special methods <special method>` to classes, as described below.
|
||||||
|
|
||||||
The :func:`dataclass` decorator examines the class to find
|
The ``@dataclass`` decorator examines the class to find
|
||||||
``field``\s. A ``field`` is defined as a class variable that has a
|
``field``\s. A ``field`` is defined as a class variable that has a
|
||||||
:term:`type annotation <variable annotation>`. With two
|
:term:`type annotation <variable annotation>`. With two
|
||||||
exceptions described below, nothing in :func:`dataclass`
|
exceptions described below, nothing in ``@dataclass``
|
||||||
examines the type specified in the variable annotation.
|
examines the type specified in the variable annotation.
|
||||||
|
|
||||||
The order of the fields in all of the generated methods is the
|
The order of the fields in all of the generated methods is the
|
||||||
order in which they appear in the class definition.
|
order in which they appear in the class definition.
|
||||||
|
|
||||||
The :func:`dataclass` decorator will add various "dunder" methods to
|
The ``@dataclass`` decorator will add various "dunder" methods to
|
||||||
the class, described below. If any of the added methods already
|
the class, described below. If any of the added methods already
|
||||||
exist in the class, the behavior depends on the parameter, as documented
|
exist in the class, the behavior depends on the parameter, as documented
|
||||||
below. The decorator returns the same class that it is called on; no new
|
below. The decorator returns the same class that it is called on; no new
|
||||||
class is created.
|
class is created.
|
||||||
|
|
||||||
If :func:`dataclass` is used just as a simple decorator with no parameters,
|
If ``@dataclass`` is used just as a simple decorator with no parameters,
|
||||||
it acts as if it has the default values documented in this
|
it acts as if it has the default values documented in this
|
||||||
signature. That is, these three uses of :func:`dataclass` are
|
signature. That is, these three uses of ``@dataclass`` are
|
||||||
equivalent::
|
equivalent::
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -84,12 +84,12 @@ Module contents
|
||||||
class C:
|
class C:
|
||||||
...
|
...
|
||||||
|
|
||||||
The parameters to :func:`dataclass` are:
|
The parameters to ``@dataclass`` are:
|
||||||
|
|
||||||
- ``init``: If true (the default), a :meth:`~object.__init__` method will be
|
- ``init``: If true (the default), a :meth:`~object.__init__` method will be
|
||||||
generated.
|
generated.
|
||||||
|
|
||||||
If the class already defines :meth:`~object.__init__`, this parameter is
|
If the class already defines :meth:`!__init__`, this parameter is
|
||||||
ignored.
|
ignored.
|
||||||
|
|
||||||
- ``repr``: If true (the default), a :meth:`~object.__repr__` method will be
|
- ``repr``: If true (the default), a :meth:`~object.__repr__` method will be
|
||||||
|
@ -99,7 +99,7 @@ Module contents
|
||||||
are not included. For example:
|
are not included. For example:
|
||||||
``InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)``.
|
``InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)``.
|
||||||
|
|
||||||
If the class already defines :meth:`~object.__repr__`, this parameter is
|
If the class already defines :meth:`!__repr__`, this parameter is
|
||||||
ignored.
|
ignored.
|
||||||
|
|
||||||
- ``eq``: If true (the default), an :meth:`~object.__eq__` method will be
|
- ``eq``: If true (the default), an :meth:`~object.__eq__` method will be
|
||||||
|
@ -107,7 +107,7 @@ Module contents
|
||||||
of its fields, in order. Both instances in the comparison must
|
of its fields, in order. Both instances in the comparison must
|
||||||
be of the identical type.
|
be of the identical type.
|
||||||
|
|
||||||
If the class already defines :meth:`~object.__eq__`, this parameter is
|
If the class already defines :meth:`!__eq__`, this parameter is
|
||||||
ignored.
|
ignored.
|
||||||
|
|
||||||
- ``order``: If true (the default is ``False``), :meth:`~object.__lt__`,
|
- ``order``: If true (the default is ``False``), :meth:`~object.__lt__`,
|
||||||
|
@ -117,43 +117,43 @@ Module contents
|
||||||
identical type. If ``order`` is true and ``eq`` is false, a
|
identical type. If ``order`` is true and ``eq`` is false, a
|
||||||
:exc:`ValueError` is raised.
|
:exc:`ValueError` is raised.
|
||||||
|
|
||||||
If the class already defines any of :meth:`~object.__lt__`,
|
If the class already defines any of :meth:`!__lt__`,
|
||||||
:meth:`~object.__le__`, :meth:`~object.__gt__`, or :meth:`~object.__ge__`, then
|
:meth:`!__le__`, :meth:`!__gt__`, or :meth:`!__ge__`, then
|
||||||
:exc:`TypeError` is raised.
|
:exc:`TypeError` is raised.
|
||||||
|
|
||||||
- ``unsafe_hash``: If ``False`` (the default), a :meth:`~object.__hash__` method
|
- ``unsafe_hash``: If ``False`` (the default), a :meth:`~object.__hash__` method
|
||||||
is generated according to how ``eq`` and ``frozen`` are set.
|
is generated according to how ``eq`` and ``frozen`` are set.
|
||||||
|
|
||||||
:meth:`~object.__hash__` is used by built-in :meth:`hash()`, and when objects are
|
:meth:`!__hash__` is used by built-in :meth:`hash()`, and when objects are
|
||||||
added to hashed collections such as dictionaries and sets. Having a
|
added to hashed collections such as dictionaries and sets. Having a
|
||||||
:meth:`~object.__hash__` implies that instances of the class are immutable.
|
:meth:`!__hash__` implies that instances of the class are immutable.
|
||||||
Mutability is a complicated property that depends on the programmer's
|
Mutability is a complicated property that depends on the programmer's
|
||||||
intent, the existence and behavior of :meth:`~object.__eq__`, and the values of
|
intent, the existence and behavior of :meth:`!__eq__`, and the values of
|
||||||
the ``eq`` and ``frozen`` flags in the :func:`dataclass` decorator.
|
the ``eq`` and ``frozen`` flags in the ``@dataclass`` decorator.
|
||||||
|
|
||||||
By default, :func:`dataclass` will not implicitly add a :meth:`~object.__hash__`
|
By default, ``@dataclass`` will not implicitly add a :meth:`~object.__hash__`
|
||||||
method unless it is safe to do so. Neither will it add or change an
|
method unless it is safe to do so. Neither will it add or change an
|
||||||
existing explicitly defined :meth:`~object.__hash__` method. Setting the class
|
existing explicitly defined :meth:`!__hash__` method. Setting the class
|
||||||
attribute ``__hash__ = None`` has a specific meaning to Python, as
|
attribute ``__hash__ = None`` has a specific meaning to Python, as
|
||||||
described in the :meth:`~object.__hash__` documentation.
|
described in the :meth:`!__hash__` documentation.
|
||||||
|
|
||||||
If :meth:`~object.__hash__` is not explicitly defined, or if it is set to ``None``,
|
If :meth:`!__hash__` is not explicitly defined, or if it is set to ``None``,
|
||||||
then :func:`dataclass` *may* add an implicit :meth:`~object.__hash__` method.
|
then ``@dataclass`` *may* add an implicit :meth:`!__hash__` method.
|
||||||
Although not recommended, you can force :func:`dataclass` to create a
|
Although not recommended, you can force ``@dataclass`` to create a
|
||||||
:meth:`~object.__hash__` method with ``unsafe_hash=True``. This might be the case
|
:meth:`!__hash__` method with ``unsafe_hash=True``. This might be the case
|
||||||
if your class is logically immutable but can still be mutated.
|
if your class is logically immutable but can still be mutated.
|
||||||
This is a specialized use case and should be considered carefully.
|
This is a specialized use case and should be considered carefully.
|
||||||
|
|
||||||
Here are the rules governing implicit creation of a :meth:`~object.__hash__`
|
Here are the rules governing implicit creation of a :meth:`!__hash__`
|
||||||
method. Note that you cannot both have an explicit :meth:`~object.__hash__`
|
method. Note that you cannot both have an explicit :meth:`!__hash__`
|
||||||
method in your dataclass and set ``unsafe_hash=True``; this will result
|
method in your dataclass and set ``unsafe_hash=True``; this will result
|
||||||
in a :exc:`TypeError`.
|
in a :exc:`TypeError`.
|
||||||
|
|
||||||
If ``eq`` and ``frozen`` are both true, by default :func:`dataclass` will
|
If ``eq`` and ``frozen`` are both true, by default ``@dataclass`` will
|
||||||
generate a :meth:`~object.__hash__` method for you. If ``eq`` is true and
|
generate a :meth:`!__hash__` method for you. If ``eq`` is true and
|
||||||
``frozen`` is false, :meth:`~object.__hash__` will be set to ``None``, marking it
|
``frozen`` is false, :meth:`!__hash__` will be set to ``None``, marking it
|
||||||
unhashable (which it is, since it is mutable). If ``eq`` is false,
|
unhashable (which it is, since it is mutable). If ``eq`` is false,
|
||||||
:meth:`~object.__hash__` will be left untouched meaning the :meth:`~object.__hash__`
|
:meth:`!__hash__` will be left untouched meaning the :meth:`!__hash__`
|
||||||
method of the superclass will be used (if the superclass is
|
method of the superclass will be used (if the superclass is
|
||||||
:class:`object`, this means it will fall back to id-based hashing).
|
:class:`object`, this means it will fall back to id-based hashing).
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ Module contents
|
||||||
- ``match_args``: If true (the default is ``True``), the
|
- ``match_args``: If true (the default is ``True``), the
|
||||||
``__match_args__`` tuple will be created from the list of
|
``__match_args__`` tuple will be created from the list of
|
||||||
parameters to the generated :meth:`~object.__init__` method (even if
|
parameters to the generated :meth:`~object.__init__` method (even if
|
||||||
:meth:`~object.__init__` is not generated, see above). If false, or if
|
:meth:`!__init__` is not generated, see above). If false, or if
|
||||||
``__match_args__`` is already defined in the class, then
|
``__match_args__`` is already defined in the class, then
|
||||||
``__match_args__`` will not be generated.
|
``__match_args__`` will not be generated.
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ Module contents
|
||||||
fields will be marked as keyword-only. If a field is marked as
|
fields will be marked as keyword-only. If a field is marked as
|
||||||
keyword-only, then the only effect is that the :meth:`~object.__init__`
|
keyword-only, then the only effect is that the :meth:`~object.__init__`
|
||||||
parameter generated from a keyword-only field must be specified
|
parameter generated from a keyword-only field must be specified
|
||||||
with a keyword when :meth:`~object.__init__` is called. There is no
|
with a keyword when :meth:`!__init__` is called. There is no
|
||||||
effect on any other aspect of dataclasses. See the
|
effect on any other aspect of dataclasses. See the
|
||||||
:term:`parameter` glossary entry for details. Also see the
|
:term:`parameter` glossary entry for details. Also see the
|
||||||
:const:`KW_ONLY` section.
|
:const:`KW_ONLY` section.
|
||||||
|
@ -184,7 +184,7 @@ Module contents
|
||||||
|
|
||||||
- ``slots``: If true (the default is ``False``), :attr:`~object.__slots__` attribute
|
- ``slots``: If true (the default is ``False``), :attr:`~object.__slots__` attribute
|
||||||
will be generated and new class will be returned instead of the original one.
|
will be generated and new class will be returned instead of the original one.
|
||||||
If :attr:`~object.__slots__` is already defined in the class, then :exc:`TypeError`
|
If :attr:`!__slots__` is already defined in the class, then :exc:`TypeError`
|
||||||
is raised.
|
is raised.
|
||||||
|
|
||||||
.. versionadded:: 3.10
|
.. versionadded:: 3.10
|
||||||
|
@ -229,7 +229,7 @@ Module contents
|
||||||
required. There are, however, some dataclass features that
|
required. There are, however, some dataclass features that
|
||||||
require additional per-field information. To satisfy this need for
|
require additional per-field information. To satisfy this need for
|
||||||
additional information, you can replace the default field value
|
additional information, you can replace the default field value
|
||||||
with a call to the provided :func:`field` function. For example::
|
with a call to the provided :func:`!field` function. For example::
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class C:
|
class C:
|
||||||
|
@ -243,10 +243,10 @@ Module contents
|
||||||
used because ``None`` is a valid value for some parameters with
|
used because ``None`` is a valid value for some parameters with
|
||||||
a distinct meaning. No code should directly use the :const:`MISSING` value.
|
a distinct meaning. No code should directly use the :const:`MISSING` value.
|
||||||
|
|
||||||
The parameters to :func:`field` are:
|
The parameters to :func:`!field` are:
|
||||||
|
|
||||||
- ``default``: If provided, this will be the default value for this
|
- ``default``: If provided, this will be the default value for this
|
||||||
field. This is needed because the :meth:`field` call itself
|
field. This is needed because the :func:`!field` call itself
|
||||||
replaces the normal position of the default value.
|
replaces the normal position of the default value.
|
||||||
|
|
||||||
- ``default_factory``: If provided, it must be a zero-argument
|
- ``default_factory``: If provided, it must be a zero-argument
|
||||||
|
@ -293,10 +293,10 @@ Module contents
|
||||||
.. versionadded:: 3.10
|
.. versionadded:: 3.10
|
||||||
|
|
||||||
If the default value of a field is specified by a call to
|
If the default value of a field is specified by a call to
|
||||||
:func:`field()`, then the class attribute for this field will be
|
:func:`!field`, then the class attribute for this field will be
|
||||||
replaced by the specified ``default`` value. If no ``default`` is
|
replaced by the specified ``default`` value. If no ``default`` is
|
||||||
provided, then the class attribute will be deleted. The intent is
|
provided, then the class attribute will be deleted. The intent is
|
||||||
that after the :func:`dataclass` decorator runs, the class
|
that after the :func:`@dataclass <dataclass>` decorator runs, the class
|
||||||
attributes will all contain the default values for the fields, just
|
attributes will all contain the default values for the fields, just
|
||||||
as if the default value itself were specified. For example,
|
as if the default value itself were specified. For example,
|
||||||
after::
|
after::
|
||||||
|
@ -314,10 +314,10 @@ Module contents
|
||||||
|
|
||||||
.. class:: Field
|
.. class:: Field
|
||||||
|
|
||||||
:class:`Field` objects describe each defined field. These objects
|
:class:`!Field` objects describe each defined field. These objects
|
||||||
are created internally, and are returned by the :func:`fields`
|
are created internally, and are returned by the :func:`fields`
|
||||||
module-level method (see below). Users should never instantiate a
|
module-level method (see below). Users should never instantiate a
|
||||||
:class:`Field` object directly. Its documented attributes are:
|
:class:`!Field` object directly. Its documented attributes are:
|
||||||
|
|
||||||
- ``name``: The name of the field.
|
- ``name``: The name of the field.
|
||||||
- ``type``: The type of the field.
|
- ``type``: The type of the field.
|
||||||
|
@ -343,7 +343,7 @@ Module contents
|
||||||
lists, and tuples are recursed into. Other objects are copied with
|
lists, and tuples are recursed into. Other objects are copied with
|
||||||
:func:`copy.deepcopy`.
|
:func:`copy.deepcopy`.
|
||||||
|
|
||||||
Example of using :func:`asdict` on nested dataclasses::
|
Example of using :func:`!asdict` on nested dataclasses::
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Point:
|
class Point:
|
||||||
|
@ -364,7 +364,7 @@ Module contents
|
||||||
|
|
||||||
dict((field.name, getattr(obj, field.name)) for field in fields(obj))
|
dict((field.name, getattr(obj, field.name)) for field in fields(obj))
|
||||||
|
|
||||||
:func:`asdict` raises :exc:`TypeError` if ``obj`` is not a dataclass
|
:func:`!asdict` raises :exc:`TypeError` if ``obj`` is not a dataclass
|
||||||
instance.
|
instance.
|
||||||
|
|
||||||
.. function:: astuple(obj, *, tuple_factory=tuple)
|
.. function:: astuple(obj, *, tuple_factory=tuple)
|
||||||
|
@ -384,7 +384,7 @@ Module contents
|
||||||
|
|
||||||
tuple(getattr(obj, field.name) for field in dataclasses.fields(obj))
|
tuple(getattr(obj, field.name) for field in dataclasses.fields(obj))
|
||||||
|
|
||||||
:func:`astuple` raises :exc:`TypeError` if ``obj`` is not a dataclass
|
:func:`!astuple` raises :exc:`TypeError` if ``obj`` is not a dataclass
|
||||||
instance.
|
instance.
|
||||||
|
|
||||||
.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None)
|
.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False, module=None)
|
||||||
|
@ -397,7 +397,7 @@ Module contents
|
||||||
``typing.Any`` is used for ``type``. The values of ``init``,
|
``typing.Any`` is used for ``type``. The values of ``init``,
|
||||||
``repr``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``,
|
``repr``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``,
|
||||||
``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` have
|
``match_args``, ``kw_only``, ``slots``, and ``weakref_slot`` have
|
||||||
the same meaning as they do in :func:`dataclass`.
|
the same meaning as they do in :func:`@dataclass <dataclass>`.
|
||||||
|
|
||||||
If ``module`` is defined, the ``__module__`` attribute
|
If ``module`` is defined, the ``__module__`` attribute
|
||||||
of the dataclass is set to that value.
|
of the dataclass is set to that value.
|
||||||
|
@ -405,7 +405,7 @@ Module contents
|
||||||
|
|
||||||
This function is not strictly required, because any Python
|
This function is not strictly required, because any Python
|
||||||
mechanism for creating a new class with ``__annotations__`` can
|
mechanism for creating a new class with ``__annotations__`` can
|
||||||
then apply the :func:`dataclass` function to convert that class to
|
then apply the ``@dataclass`` function to convert that class to
|
||||||
a dataclass. This function is provided as a convenience. For
|
a dataclass. This function is provided as a convenience. For
|
||||||
example::
|
example::
|
||||||
|
|
||||||
|
@ -438,15 +438,15 @@ Module contents
|
||||||
:meth:`__post_init__`, if present, is also called.
|
:meth:`__post_init__`, if present, is also called.
|
||||||
|
|
||||||
Init-only variables without default values, if any exist, must be
|
Init-only variables without default values, if any exist, must be
|
||||||
specified on the call to :func:`replace` so that they can be passed to
|
specified on the call to :func:`!replace` so that they can be passed to
|
||||||
:meth:`~object.__init__` and :meth:`__post_init__`.
|
:meth:`!__init__` and :meth:`__post_init__`.
|
||||||
|
|
||||||
It is an error for ``changes`` to contain any fields that are
|
It is an error for ``changes`` to contain any fields that are
|
||||||
defined as having ``init=False``. A :exc:`ValueError` will be raised
|
defined as having ``init=False``. A :exc:`ValueError` will be raised
|
||||||
in this case.
|
in this case.
|
||||||
|
|
||||||
Be forewarned about how ``init=False`` fields work during a call to
|
Be forewarned about how ``init=False`` fields work during a call to
|
||||||
:func:`replace`. They are not copied from the source object, but
|
:func:`!replace`. They are not copied from the source object, but
|
||||||
rather are initialized in :meth:`__post_init__`, if they're
|
rather are initialized in :meth:`__post_init__`, if they're
|
||||||
initialized at all. It is expected that ``init=False`` fields will
|
initialized at all. It is expected that ``init=False`` fields will
|
||||||
be rarely and judiciously used. If they are used, it might be wise
|
be rarely and judiciously used. If they are used, it might be wise
|
||||||
|
@ -475,11 +475,11 @@ Module contents
|
||||||
.. data:: KW_ONLY
|
.. data:: KW_ONLY
|
||||||
|
|
||||||
A sentinel value used as a type annotation. Any fields after a
|
A sentinel value used as a type annotation. Any fields after a
|
||||||
pseudo-field with the type of :const:`KW_ONLY` are marked as
|
pseudo-field with the type of :const:`!KW_ONLY` are marked as
|
||||||
keyword-only fields. Note that a pseudo-field of type
|
keyword-only fields. Note that a pseudo-field of type
|
||||||
:const:`KW_ONLY` is otherwise completely ignored. This includes the
|
:const:`!KW_ONLY` is otherwise completely ignored. This includes the
|
||||||
name of such a field. By convention, a name of ``_`` is used for a
|
name of such a field. By convention, a name of ``_`` is used for a
|
||||||
:const:`KW_ONLY` field. Keyword-only fields signify
|
:const:`!KW_ONLY` field. Keyword-only fields signify
|
||||||
:meth:`~object.__init__` parameters that must be specified as keywords when
|
:meth:`~object.__init__` parameters that must be specified as keywords when
|
||||||
the class is instantiated.
|
the class is instantiated.
|
||||||
|
|
||||||
|
@ -495,7 +495,7 @@ Module contents
|
||||||
p = Point(0, y=1.5, z=2.0)
|
p = Point(0, y=1.5, z=2.0)
|
||||||
|
|
||||||
In a single dataclass, it is an error to specify more than one
|
In a single dataclass, it is an error to specify more than one
|
||||||
field whose type is :const:`KW_ONLY`.
|
field whose type is :const:`!KW_ONLY`.
|
||||||
|
|
||||||
.. versionadded:: 3.10
|
.. versionadded:: 3.10
|
||||||
|
|
||||||
|
@ -515,9 +515,9 @@ Post-init processing
|
||||||
When defined on the class, it will be called by the generated
|
When defined on the class, it will be called by the generated
|
||||||
:meth:`~object.__init__`, normally as ``self.__post_init__()``.
|
:meth:`~object.__init__`, normally as ``self.__post_init__()``.
|
||||||
However, if any ``InitVar`` fields are defined, they will also be
|
However, if any ``InitVar`` fields are defined, they will also be
|
||||||
passed to :meth:`__post_init__` in the order they were defined in the
|
passed to :meth:`!__post_init__` in the order they were defined in the
|
||||||
class. If no :meth:`~object.__init__` method is generated, then
|
class. If no :meth:`!__init__` method is generated, then
|
||||||
:meth:`__post_init__` will not automatically be called.
|
:meth:`!__post_init__` will not automatically be called.
|
||||||
|
|
||||||
Among other uses, this allows for initializing field values that
|
Among other uses, this allows for initializing field values that
|
||||||
depend on one or more other fields. For example::
|
depend on one or more other fields. For example::
|
||||||
|
@ -531,8 +531,8 @@ Post-init processing
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
self.c = self.a + self.b
|
self.c = self.a + self.b
|
||||||
|
|
||||||
The :meth:`~object.__init__` method generated by :func:`dataclass` does not call base
|
The :meth:`~object.__init__` method generated by :func:`@dataclass <dataclass>` does not call base
|
||||||
class :meth:`~object.__init__` methods. If the base class has an :meth:`~object.__init__` method
|
class :meth:`!__init__` methods. If the base class has an :meth:`!__init__` method
|
||||||
that has to be called, it is common to call this method in a
|
that has to be called, it is common to call this method in a
|
||||||
:meth:`__post_init__` method::
|
:meth:`__post_init__` method::
|
||||||
|
|
||||||
|
@ -548,18 +548,18 @@ that has to be called, it is common to call this method in a
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
super().__init__(self.side, self.side)
|
super().__init__(self.side, self.side)
|
||||||
|
|
||||||
Note, however, that in general the dataclass-generated :meth:`~object.__init__` methods
|
Note, however, that in general the dataclass-generated :meth:`!__init__` methods
|
||||||
don't need to be called, since the derived dataclass will take care of
|
don't need to be called, since the derived dataclass will take care of
|
||||||
initializing all fields of any base class that is a dataclass itself.
|
initializing all fields of any base class that is a dataclass itself.
|
||||||
|
|
||||||
See the section below on init-only variables for ways to pass
|
See the section below on init-only variables for ways to pass
|
||||||
parameters to :meth:`__post_init__`. Also see the warning about how
|
parameters to :meth:`!__post_init__`. Also see the warning about how
|
||||||
:func:`replace` handles ``init=False`` fields.
|
:func:`replace` handles ``init=False`` fields.
|
||||||
|
|
||||||
Class variables
|
Class variables
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
One of the few places where :func:`dataclass` actually inspects the type
|
One of the few places where :func:`@dataclass <dataclass>` actually inspects the type
|
||||||
of a field is to determine if a field is a class variable as defined
|
of a field is to determine if a field is a class variable as defined
|
||||||
in :pep:`526`. It does this by checking if the type of the field is
|
in :pep:`526`. It does this by checking if the type of the field is
|
||||||
``typing.ClassVar``. If a field is a ``ClassVar``, it is excluded
|
``typing.ClassVar``. If a field is a ``ClassVar``, it is excluded
|
||||||
|
@ -570,7 +570,7 @@ module-level :func:`fields` function.
|
||||||
Init-only variables
|
Init-only variables
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Another place where :func:`dataclass` inspects a type annotation is to
|
Another place where :func:`@dataclass <dataclass>` inspects a type annotation is to
|
||||||
determine if a field is an init-only variable. It does this by seeing
|
determine if a field is an init-only variable. It does this by seeing
|
||||||
if the type of a field is of type ``dataclasses.InitVar``. If a field
|
if the type of a field is of type ``dataclasses.InitVar``. If a field
|
||||||
is an ``InitVar``, it is considered a pseudo-field called an init-only
|
is an ``InitVar``, it is considered a pseudo-field called an init-only
|
||||||
|
@ -602,19 +602,19 @@ Frozen instances
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
It is not possible to create truly immutable Python objects. However,
|
It is not possible to create truly immutable Python objects. However,
|
||||||
by passing ``frozen=True`` to the :meth:`dataclass` decorator you can
|
by passing ``frozen=True`` to the :func:`@dataclass <dataclass>` decorator you can
|
||||||
emulate immutability. In that case, dataclasses will add
|
emulate immutability. In that case, dataclasses will add
|
||||||
:meth:`~object.__setattr__` and :meth:`~object.__delattr__` methods to the class. These
|
:meth:`~object.__setattr__` and :meth:`~object.__delattr__` methods to the class. These
|
||||||
methods will raise a :exc:`FrozenInstanceError` when invoked.
|
methods will raise a :exc:`FrozenInstanceError` when invoked.
|
||||||
|
|
||||||
There is a tiny performance penalty when using ``frozen=True``:
|
There is a tiny performance penalty when using ``frozen=True``:
|
||||||
:meth:`~object.__init__` cannot use simple assignment to initialize fields, and
|
:meth:`~object.__init__` cannot use simple assignment to initialize fields, and
|
||||||
must use :meth:`!object.__setattr__`.
|
must use :meth:`!__setattr__`.
|
||||||
|
|
||||||
Inheritance
|
Inheritance
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
When the dataclass is being created by the :meth:`dataclass` decorator,
|
When the dataclass is being created by the :func:`@dataclass <dataclass>` decorator,
|
||||||
it looks through all of the class's base classes in reverse MRO (that
|
it looks through all of the class's base classes in reverse MRO (that
|
||||||
is, starting at :class:`object`) and, for each dataclass that it finds,
|
is, starting at :class:`object`) and, for each dataclass that it finds,
|
||||||
adds the fields from that base class to an ordered mapping of fields.
|
adds the fields from that base class to an ordered mapping of fields.
|
||||||
|
@ -641,8 +641,8 @@ The generated :meth:`~object.__init__` method for ``C`` will look like::
|
||||||
|
|
||||||
def __init__(self, x: int = 15, y: int = 0, z: int = 10):
|
def __init__(self, x: int = 15, y: int = 0, z: int = 10):
|
||||||
|
|
||||||
Re-ordering of keyword-only parameters in :meth:`~object.__init__`
|
Re-ordering of keyword-only parameters in :meth:`!__init__`
|
||||||
------------------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
|
|
||||||
After the parameters needed for :meth:`~object.__init__` are computed, any
|
After the parameters needed for :meth:`~object.__init__` are computed, any
|
||||||
keyword-only parameters are moved to come after all regular
|
keyword-only parameters are moved to come after all regular
|
||||||
|
@ -665,7 +665,7 @@ fields, and ``Base.x`` and ``D.z`` are regular fields::
|
||||||
z: int = 10
|
z: int = 10
|
||||||
t: int = field(kw_only=True, default=0)
|
t: int = field(kw_only=True, default=0)
|
||||||
|
|
||||||
The generated :meth:`~object.__init__` method for ``D`` will look like::
|
The generated :meth:`!__init__` method for ``D`` will look like::
|
||||||
|
|
||||||
def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0):
|
def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0):
|
||||||
|
|
||||||
|
@ -674,7 +674,7 @@ the list of fields: parameters derived from regular fields are
|
||||||
followed by parameters derived from keyword-only fields.
|
followed by parameters derived from keyword-only fields.
|
||||||
|
|
||||||
The relative ordering of keyword-only parameters is maintained in the
|
The relative ordering of keyword-only parameters is maintained in the
|
||||||
re-ordered :meth:`~object.__init__` parameter list.
|
re-ordered :meth:`!__init__` parameter list.
|
||||||
|
|
||||||
|
|
||||||
Default factory functions
|
Default factory functions
|
||||||
|
@ -689,7 +689,7 @@ example, to create a new instance of a list, use::
|
||||||
If a field is excluded from :meth:`~object.__init__` (using ``init=False``)
|
If a field is excluded from :meth:`~object.__init__` (using ``init=False``)
|
||||||
and the field also specifies ``default_factory``, then the default
|
and the field also specifies ``default_factory``, then the default
|
||||||
factory function will always be called from the generated
|
factory function will always be called from the generated
|
||||||
:meth:`~object.__init__` function. This happens because there is no other
|
:meth:`!__init__` function. This happens because there is no other
|
||||||
way to give the field an initial value.
|
way to give the field an initial value.
|
||||||
|
|
||||||
Mutable default values
|
Mutable default values
|
||||||
|
@ -738,7 +738,7 @@ for ``x`` when creating a class instance will share the same copy
|
||||||
of ``x``. Because dataclasses just use normal Python class
|
of ``x``. Because dataclasses just use normal Python class
|
||||||
creation they also share this behavior. There is no general way
|
creation they also share this behavior. There is no general way
|
||||||
for Data Classes to detect this condition. Instead, the
|
for Data Classes to detect this condition. Instead, the
|
||||||
:func:`dataclass` decorator will raise a :exc:`ValueError` if it
|
:func:`@dataclass <dataclass>` decorator will raise a :exc:`ValueError` if it
|
||||||
detects an unhashable default parameter. The assumption is that if
|
detects an unhashable default parameter. The assumption is that if
|
||||||
a value is unhashable, it is mutable. This is a partial solution,
|
a value is unhashable, it is mutable. This is a partial solution,
|
||||||
but it does protect against many common errors.
|
but it does protect against many common errors.
|
||||||
|
@ -764,15 +764,17 @@ Descriptor-typed fields
|
||||||
Fields that are assigned :ref:`descriptor objects <descriptors>` as their
|
Fields that are assigned :ref:`descriptor objects <descriptors>` as their
|
||||||
default value have the following special behaviors:
|
default value have the following special behaviors:
|
||||||
|
|
||||||
* The value for the field passed to the dataclass's ``__init__`` method is
|
* The value for the field passed to the dataclass's :meth:`~object.__init__` method is
|
||||||
passed to the descriptor's ``__set__`` method rather than overwriting the
|
passed to the descriptor's :meth:`~object.__set__` method rather than overwriting the
|
||||||
descriptor object.
|
descriptor object.
|
||||||
|
|
||||||
* Similarly, when getting or setting the field, the descriptor's
|
* Similarly, when getting or setting the field, the descriptor's
|
||||||
``__get__`` or ``__set__`` method is called rather than returning or
|
:meth:`~object.__get__` or :meth:`!__set__` method is called rather than returning or
|
||||||
overwriting the descriptor object.
|
overwriting the descriptor object.
|
||||||
* To determine whether a field contains a default value, ``dataclasses``
|
|
||||||
will call the descriptor's ``__get__`` method using its class access
|
* To determine whether a field contains a default value, :func:`@dataclass <dataclass>`
|
||||||
form (i.e. ``descriptor.__get__(obj=None, type=cls)``. If the
|
will call the descriptor's :meth:`!__get__` method using its class access
|
||||||
|
form: ``descriptor.__get__(obj=None, type=cls)``. If the
|
||||||
descriptor returns a value in this case, it will be used as the
|
descriptor returns a value in this case, it will be used as the
|
||||||
field's default. On the other hand, if the descriptor raises
|
field's default. On the other hand, if the descriptor raises
|
||||||
:exc:`AttributeError` in this situation, no default value will be
|
:exc:`AttributeError` in this situation, no default value will be
|
||||||
|
|
Loading…
Reference in New Issue