blob: e13685e207cd0e0ef628af5a9eb231d4101acc5b [file] [log] [blame]
Eric V. Smith7a1c0272018-05-16 09:29:05 -04001:mod:`dataclasses` --- Data Classes
2===================================
Eric V. Smith98d50cb2018-05-16 04:20:43 -04003
4.. module:: dataclasses
Eric V. Smith7a1c0272018-05-16 09:29:05 -04005 :synopsis: Generate special methods on user-defined classes.
Eric V. Smith98d50cb2018-05-16 04:20:43 -04006
7.. moduleauthor:: Eric V. Smith <eric@trueblade.com>
8.. sectionauthor:: Eric V. Smith <eric@trueblade.com>
9
10**Source code:** :source:`Lib/dataclasses.py`
11
12--------------
13
14This module provides a decorator and functions for automatically
15adding generated :term:`special method`\s such as :meth:`__init__` and
16:meth:`__repr__` to user-defined classes. It was originally described
17in :pep:`557`.
18
19The member variables to use in these generated methods are defined
20using :pep:`526` type annotations. For example this code::
21
Ned Batchelder2effef72020-05-08 07:39:57 -040022 from dataclasses import dataclass
23
Eric V. Smith98d50cb2018-05-16 04:20:43 -040024 @dataclass
25 class InventoryItem:
marload61bb24a2020-07-09 21:13:47 +090026 """Class for keeping track of an item in inventory."""
Eric V. Smith98d50cb2018-05-16 04:20:43 -040027 name: str
28 unit_price: float
29 quantity_on_hand: int = 0
30
31 def total_cost(self) -> float:
32 return self.unit_price * self.quantity_on_hand
33
34Will add, among other things, a :meth:`__init__` that looks like::
35
36 def __init__(self, name: str, unit_price: float, quantity_on_hand: int=0):
37 self.name = name
38 self.unit_price = unit_price
39 self.quantity_on_hand = quantity_on_hand
40
41Note that this method is automatically added to the class: it is not
42directly specified in the ``InventoryItem`` definition shown above.
43
44.. versionadded:: 3.7
45
46Module-level decorators, classes, and functions
47-----------------------------------------------
48
Eric V. Smithc0280532021-04-25 20:42:39 -040049.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False)
Eric V. Smith98d50cb2018-05-16 04:20:43 -040050
51 This function is a :term:`decorator` that is used to add generated
52 :term:`special method`\s to classes, as described below.
53
54 The :func:`dataclass` decorator examines the class to find
55 ``field``\s. A ``field`` is defined as class variable that has a
Cheryl Sabellab7105c92018-12-24 00:09:09 -050056 :term:`type annotation <variable annotation>`. With two
57 exceptions described below, nothing in :func:`dataclass`
58 examines the type specified in the variable annotation.
Eric V. Smith98d50cb2018-05-16 04:20:43 -040059
60 The order of the fields in all of the generated methods is the
61 order in which they appear in the class definition.
62
63 The :func:`dataclass` decorator will add various "dunder" methods to
64 the class, described below. If any of the added methods already
Fabio Sangiovannie28aff52019-12-25 23:45:30 +010065 exist on the class, the behavior depends on the parameter, as documented
66 below. The decorator returns the same class that is called on; no new
67 class is created.
Eric V. Smith98d50cb2018-05-16 04:20:43 -040068
69 If :func:`dataclass` is used just as a simple decorator with no parameters,
70 it acts as if it has the default values documented in this
71 signature. That is, these three uses of :func:`dataclass` are
72 equivalent::
73
74 @dataclass
75 class C:
76 ...
77
78 @dataclass()
79 class C:
80 ...
81
Eric V. Smithc0280532021-04-25 20:42:39 -040082 @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False)
Eric V. Smith98d50cb2018-05-16 04:20:43 -040083 class C:
84 ...
85
86 The parameters to :func:`dataclass` are:
87
88 - ``init``: If true (the default), a :meth:`__init__` method will be
89 generated.
90
91 If the class already defines :meth:`__init__`, this parameter is
92 ignored.
93
94 - ``repr``: If true (the default), a :meth:`__repr__` method will be
95 generated. The generated repr string will have the class name and
96 the name and repr of each field, in the order they are defined in
97 the class. Fields that are marked as being excluded from the repr
98 are not included. For example:
99 ``InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)``.
100
101 If the class already defines :meth:`__repr__`, this parameter is
102 ignored.
103
104 - ``eq``: If true (the default), an :meth:`__eq__` method will be
105 generated. This method compares the class as if it were a tuple
106 of its fields, in order. Both instances in the comparison must
107 be of the identical type.
108
109 If the class already defines :meth:`__eq__`, this parameter is
110 ignored.
111
112 - ``order``: If true (the default is ``False``), :meth:`__lt__`,
113 :meth:`__le__`, :meth:`__gt__`, and :meth:`__ge__` methods will be
114 generated. These compare the class as if it were a tuple of its
115 fields, in order. Both instances in the comparison must be of the
116 identical type. If ``order`` is true and ``eq`` is false, a
117 :exc:`ValueError` is raised.
118
119 If the class already defines any of :meth:`__lt__`,
120 :meth:`__le__`, :meth:`__gt__`, or :meth:`__ge__`, then
Fabio Sangiovannie28aff52019-12-25 23:45:30 +0100121 :exc:`TypeError` is raised.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400122
Barry Warsaw713a9362018-05-16 15:50:07 -0400123 - ``unsafe_hash``: If ``False`` (the default), a :meth:`__hash__` method
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400124 is generated according to how ``eq`` and ``frozen`` are set.
125
Barry Warsaw713a9362018-05-16 15:50:07 -0400126 :meth:`__hash__` is used by built-in :meth:`hash()`, and when objects are
127 added to hashed collections such as dictionaries and sets. Having a
128 :meth:`__hash__` implies that instances of the class are immutable.
129 Mutability is a complicated property that depends on the programmer's
130 intent, the existence and behavior of :meth:`__eq__`, and the values of
131 the ``eq`` and ``frozen`` flags in the :func:`dataclass` decorator.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400132
Barry Warsaw713a9362018-05-16 15:50:07 -0400133 By default, :func:`dataclass` will not implicitly add a :meth:`__hash__`
134 method unless it is safe to do so. Neither will it add or change an
135 existing explicitly defined :meth:`__hash__` method. Setting the class
136 attribute ``__hash__ = None`` has a specific meaning to Python, as
137 described in the :meth:`__hash__` documentation.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400138
Guilherme Martins Crocetti05540442021-03-08 19:50:39 -0300139 If :meth:`__hash__` is not explicitly defined, or if it is set to ``None``,
Barry Warsaw713a9362018-05-16 15:50:07 -0400140 then :func:`dataclass` *may* add an implicit :meth:`__hash__` method.
141 Although not recommended, you can force :func:`dataclass` to create a
142 :meth:`__hash__` method with ``unsafe_hash=True``. This might be the case
143 if your class is logically immutable but can nonetheless be mutated.
144 This is a specialized use case and should be considered carefully.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400145
Barry Warsaw713a9362018-05-16 15:50:07 -0400146 Here are the rules governing implicit creation of a :meth:`__hash__`
147 method. Note that you cannot both have an explicit :meth:`__hash__`
148 method in your dataclass and set ``unsafe_hash=True``; this will result
149 in a :exc:`TypeError`.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400150
Barry Warsaw713a9362018-05-16 15:50:07 -0400151 If ``eq`` and ``frozen`` are both true, by default :func:`dataclass` will
152 generate a :meth:`__hash__` method for you. If ``eq`` is true and
153 ``frozen`` is false, :meth:`__hash__` will be set to ``None``, marking it
154 unhashable (which it is, since it is mutable). If ``eq`` is false,
155 :meth:`__hash__` will be left untouched meaning the :meth:`__hash__`
156 method of the superclass will be used (if the superclass is
157 :class:`object`, this means it will fall back to id-based hashing).
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400158
Serhiy Storchaka138ccbb2019-11-12 16:57:03 +0200159 - ``frozen``: If true (the default is ``False``), assigning to fields will
Barry Warsaw713a9362018-05-16 15:50:07 -0400160 generate an exception. This emulates read-only frozen instances. If
161 :meth:`__setattr__` or :meth:`__delattr__` is defined in the class, then
162 :exc:`TypeError` is raised. See the discussion below.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400163
Eric V. Smith750f4842021-04-10 21:28:42 -0400164 - ``match_args``: If true (the default is ``True``), the
165 ``__match_args__`` tuple will be created from the list of
166 parameters to the generated :meth:`__init__` method (even if
167 :meth:`__init__` is not generated, see above). If false, or if
168 ``__match_args__`` is already defined in the class, then
169 ``__match_args__`` will not be generated.
170
Eric V. Smithc0280532021-04-25 20:42:39 -0400171 - ``kw_only``: If true (the default value is ``False``), then all
172 fields will be marked as keyword-only. See the :term:`parameter`
173 glossary entry for details. Also see the ``dataclasses.KW_ONLY``
174 section.
Eric V. Smith750f4842021-04-10 21:28:42 -0400175
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400176 ``field``\s may optionally specify a default value, using normal
177 Python syntax::
178
179 @dataclass
180 class C:
181 a: int # 'a' has no default value
182 b: int = 0 # assign a default value for 'b'
183
184 In this example, both ``a`` and ``b`` will be included in the added
185 :meth:`__init__` method, which will be defined as::
186
187 def __init__(self, a: int, b: int = 0):
188
189 :exc:`TypeError` will be raised if a field without a default value
190 follows a field with a default value. This is true either when this
191 occurs in a single class, or as a result of class inheritance.
192
193.. function:: field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None)
194
195 For common and simple use cases, no other functionality is
Barry Warsaw713a9362018-05-16 15:50:07 -0400196 required. There are, however, some dataclass features that
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400197 require additional per-field information. To satisfy this need for
198 additional information, you can replace the default field value
199 with a call to the provided :func:`field` function. For example::
200
201 @dataclass
202 class C:
Andre Delfino7f54e562020-10-03 19:10:59 -0300203 mylist: list[int] = field(default_factory=list)
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400204
205 c = C()
Barry Warsaw713a9362018-05-16 15:50:07 -0400206 c.mylist += [1, 2, 3]
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400207
208 As shown above, the ``MISSING`` value is a sentinel object used to
209 detect if the ``default`` and ``default_factory`` parameters are
210 provided. This sentinel is used because ``None`` is a valid value
211 for ``default``. No code should directly use the ``MISSING``
212 value.
213
214 The parameters to :func:`field` are:
215
216 - ``default``: If provided, this will be the default value for this
217 field. This is needed because the :meth:`field` call itself
218 replaces the normal position of the default value.
219
220 - ``default_factory``: If provided, it must be a zero-argument
221 callable that will be called when a default value is needed for
222 this field. Among other purposes, this can be used to specify
223 fields with mutable default values, as discussed below. It is an
224 error to specify both ``default`` and ``default_factory``.
225
226 - ``init``: If true (the default), this field is included as a
227 parameter to the generated :meth:`__init__` method.
228
229 - ``repr``: If true (the default), this field is included in the
230 string returned by the generated :meth:`__repr__` method.
231
232 - ``compare``: If true (the default), this field is included in the
233 generated equality and comparison methods (:meth:`__eq__`,
234 :meth:`__gt__`, et al.).
235
Barry Warsaw713a9362018-05-16 15:50:07 -0400236 - ``hash``: This can be a bool or ``None``. If true, this field is
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400237 included in the generated :meth:`__hash__` method. If ``None`` (the
238 default), use the value of ``compare``: this would normally be
239 the expected behavior. A field should be considered in the hash
240 if it's used for comparisons. Setting this value to anything
241 other than ``None`` is discouraged.
242
243 One possible reason to set ``hash=False`` but ``compare=True``
244 would be if a field is expensive to compute a hash value for,
245 that field is needed for equality testing, and there are other
246 fields that contribute to the type's hash value. Even if a field
247 is excluded from the hash, it will still be used for comparisons.
248
249 - ``metadata``: This can be a mapping or None. None is treated as
250 an empty dict. This value is wrapped in
251 :func:`~types.MappingProxyType` to make it read-only, and exposed
252 on the :class:`Field` object. It is not used at all by Data
253 Classes, and is provided as a third-party extension mechanism.
254 Multiple third-parties can each have their own key, to use as a
255 namespace in the metadata.
256
257 If the default value of a field is specified by a call to
258 :func:`field()`, then the class attribute for this field will be
259 replaced by the specified ``default`` value. If no ``default`` is
260 provided, then the class attribute will be deleted. The intent is
261 that after the :func:`dataclass` decorator runs, the class
262 attributes will all contain the default values for the fields, just
263 as if the default value itself were specified. For example,
264 after::
265
266 @dataclass
267 class C:
268 x: int
269 y: int = field(repr=False)
270 z: int = field(repr=False, default=10)
271 t: int = 20
272
273 The class attribute ``C.z`` will be ``10``, the class attribute
274 ``C.t`` will be ``20``, and the class attributes ``C.x`` and
275 ``C.y`` will not be set.
276
277.. class:: Field
278
279 :class:`Field` objects describe each defined field. These objects
280 are created internally, and are returned by the :func:`fields`
281 module-level method (see below). Users should never instantiate a
282 :class:`Field` object directly. Its documented attributes are:
283
284 - ``name``: The name of the field.
285
286 - ``type``: The type of the field.
287
288 - ``default``, ``default_factory``, ``init``, ``repr``, ``hash``,
289 ``compare``, and ``metadata`` have the identical meaning and
290 values as they do in the :func:`field` declaration.
291
292 Other attributes may exist, but they are private and must not be
293 inspected or relied on.
294
295.. function:: fields(class_or_instance)
296
Barry Warsaw713a9362018-05-16 15:50:07 -0400297 Returns a tuple of :class:`Field` objects that define the fields for this
298 dataclass. Accepts either a dataclass, or an instance of a dataclass.
299 Raises :exc:`TypeError` if not passed a dataclass or instance of one.
300 Does not return pseudo-fields which are ``ClassVar`` or ``InitVar``.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400301
302.. function:: asdict(instance, *, dict_factory=dict)
303
Barry Warsaw713a9362018-05-16 15:50:07 -0400304 Converts the dataclass ``instance`` to a dict (by using the
305 factory function ``dict_factory``). Each dataclass is converted
306 to a dict of its fields, as ``name: value`` pairs. dataclasses, dicts,
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400307 lists, and tuples are recursed into. For example::
308
309 @dataclass
310 class Point:
311 x: int
312 y: int
313
314 @dataclass
315 class C:
Andre Delfino7f54e562020-10-03 19:10:59 -0300316 mylist: list[Point]
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400317
318 p = Point(10, 20)
319 assert asdict(p) == {'x': 10, 'y': 20}
320
321 c = C([Point(0, 0), Point(10, 4)])
Barry Warsaw713a9362018-05-16 15:50:07 -0400322 assert asdict(c) == {'mylist': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]}
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400323
Barry Warsaw713a9362018-05-16 15:50:07 -0400324 Raises :exc:`TypeError` if ``instance`` is not a dataclass instance.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400325
방성범 (Bang Seongbeom)508d8202018-09-29 19:50:31 +0900326.. function:: astuple(instance, *, tuple_factory=tuple)
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400327
Barry Warsaw713a9362018-05-16 15:50:07 -0400328 Converts the dataclass ``instance`` to a tuple (by using the
329 factory function ``tuple_factory``). Each dataclass is converted
330 to a tuple of its field values. dataclasses, dicts, lists, and
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400331 tuples are recursed into.
332
333 Continuing from the previous example::
334
335 assert astuple(p) == (10, 20)
336 assert astuple(c) == ([(0, 0), (10, 4)],)
337
Barry Warsaw713a9362018-05-16 15:50:07 -0400338 Raises :exc:`TypeError` if ``instance`` is not a dataclass instance.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400339
Eric V. Smithc0280532021-04-25 20:42:39 -0400340.. 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)
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400341
Barry Warsaw713a9362018-05-16 15:50:07 -0400342 Creates a new dataclass with name ``cls_name``, fields as defined
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400343 in ``fields``, base classes as given in ``bases``, and initialized
344 with a namespace as given in ``namespace``. ``fields`` is an
345 iterable whose elements are each either ``name``, ``(name, type)``,
346 or ``(name, type, Field)``. If just ``name`` is supplied,
347 ``typing.Any`` is used for ``type``. The values of ``init``,
Eric V. Smithc0280532021-04-25 20:42:39 -0400348 ``repr``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``,
349 ``match_args``, and ``kw_only`` have the same meaning as they do
350 in :func:`dataclass`.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400351
352 This function is not strictly required, because any Python
353 mechanism for creating a new class with ``__annotations__`` can
354 then apply the :func:`dataclass` function to convert that class to
Barry Warsaw713a9362018-05-16 15:50:07 -0400355 a dataclass. This function is provided as a convenience. For
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400356 example::
357
358 C = make_dataclass('C',
359 [('x', int),
360 'y',
361 ('z', int, field(default=5))],
362 namespace={'add_one': lambda self: self.x + 1})
363
364 Is equivalent to::
365
366 @dataclass
367 class C:
368 x: int
369 y: 'typing.Any'
370 z: int = 5
371
372 def add_one(self):
373 return self.x + 1
374
Serhiy Storchaka2d88e632019-06-26 19:07:44 +0300375.. function:: replace(instance, /, **changes)
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400376
377 Creates a new object of the same type of ``instance``, replacing
378 fields with values from ``changes``. If ``instance`` is not a Data
379 Class, raises :exc:`TypeError`. If values in ``changes`` do not
380 specify fields, raises :exc:`TypeError`.
381
382 The newly returned object is created by calling the :meth:`__init__`
Barry Warsaw713a9362018-05-16 15:50:07 -0400383 method of the dataclass. This ensures that
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400384 :meth:`__post_init__`, if present, is also called.
385
386 Init-only variables without default values, if any exist, must be
387 specified on the call to :func:`replace` so that they can be passed to
388 :meth:`__init__` and :meth:`__post_init__`.
389
Barry Warsaw713a9362018-05-16 15:50:07 -0400390 It is an error for ``changes`` to contain any fields that are
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400391 defined as having ``init=False``. A :exc:`ValueError` will be raised
392 in this case.
393
394 Be forewarned about how ``init=False`` fields work during a call to
395 :func:`replace`. They are not copied from the source object, but
396 rather are initialized in :meth:`__post_init__`, if they're
397 initialized at all. It is expected that ``init=False`` fields will
398 be rarely and judiciously used. If they are used, it might be wise
399 to have alternate class constructors, or perhaps a custom
400 ``replace()`` (or similarly named) method which handles instance
401 copying.
402
403.. function:: is_dataclass(class_or_instance)
404
Serhiy Storchaka138ccbb2019-11-12 16:57:03 +0200405 Return ``True`` if its parameter is a dataclass or an instance of one,
406 otherwise return ``False``.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400407
408 If you need to know if a class is an instance of a dataclass (and
409 not a dataclass itself), then add a further check for ``not
410 isinstance(obj, type)``::
411
412 def is_dataclass_instance(obj):
413 return is_dataclass(obj) and not isinstance(obj, type)
414
415Post-init processing
416--------------------
417
418The generated :meth:`__init__` code will call a method named
419:meth:`__post_init__`, if :meth:`__post_init__` is defined on the
420class. It will normally be called as ``self.__post_init__()``.
421However, if any ``InitVar`` fields are defined, they will also be
Barry Warsaw713a9362018-05-16 15:50:07 -0400422passed to :meth:`__post_init__` in the order they were defined in the
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400423class. If no :meth:`__init__` method is generated, then
424:meth:`__post_init__` will not automatically be called.
425
426Among other uses, this allows for initializing field values that
427depend on one or more other fields. For example::
428
429 @dataclass
430 class C:
431 a: float
432 b: float
433 c: float = field(init=False)
434
435 def __post_init__(self):
436 self.c = self.a + self.b
437
438See the section below on init-only variables for ways to pass
439parameters to :meth:`__post_init__`. Also see the warning about how
440:func:`replace` handles ``init=False`` fields.
441
442Class variables
443---------------
444
445One of two places where :func:`dataclass` actually inspects the type
446of a field is to determine if a field is a class variable as defined
447in :pep:`526`. It does this by checking if the type of the field is
448``typing.ClassVar``. If a field is a ``ClassVar``, it is excluded
Barry Warsaw713a9362018-05-16 15:50:07 -0400449from consideration as a field and is ignored by the dataclass
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400450mechanisms. Such ``ClassVar`` pseudo-fields are not returned by the
451module-level :func:`fields` function.
452
453Init-only variables
454-------------------
455
456The other place where :func:`dataclass` inspects a type annotation is to
457determine if a field is an init-only variable. It does this by seeing
458if the type of a field is of type ``dataclasses.InitVar``. If a field
459is an ``InitVar``, it is considered a pseudo-field called an init-only
460field. As it is not a true field, it is not returned by the
461module-level :func:`fields` function. Init-only fields are added as
462parameters to the generated :meth:`__init__` method, and are passed to
463the optional :meth:`__post_init__` method. They are not otherwise used
Barry Warsaw713a9362018-05-16 15:50:07 -0400464by dataclasses.
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400465
Daniel Dương075b3c32018-08-24 16:19:24 +0700466For example, suppose a field will be initialized from a database, if a
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400467value is not provided when creating the class::
468
469 @dataclass
470 class C:
471 i: int
472 j: int = None
473 database: InitVar[DatabaseType] = None
474
475 def __post_init__(self, database):
476 if self.j is None and database is not None:
477 self.j = database.lookup('j')
478
479 c = C(10, database=my_database)
480
481In this case, :func:`fields` will return :class:`Field` objects for ``i`` and
482``j``, but not for ``database``.
483
484Frozen instances
485----------------
486
487It is not possible to create truly immutable Python objects. However,
488by passing ``frozen=True`` to the :meth:`dataclass` decorator you can
Barry Warsaw713a9362018-05-16 15:50:07 -0400489emulate immutability. In that case, dataclasses will add
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400490:meth:`__setattr__` and :meth:`__delattr__` methods to the class. These
491methods will raise a :exc:`FrozenInstanceError` when invoked.
492
493There is a tiny performance penalty when using ``frozen=True``:
494:meth:`__init__` cannot use simple assignment to initialize fields, and
495must use :meth:`object.__setattr__`.
496
497Inheritance
498-----------
499
Barry Warsaw713a9362018-05-16 15:50:07 -0400500When the dataclass is being created by the :meth:`dataclass` decorator,
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400501it looks through all of the class's base classes in reverse MRO (that
Barry Warsaw713a9362018-05-16 15:50:07 -0400502is, starting at :class:`object`) and, for each dataclass that it finds,
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400503adds the fields from that base class to an ordered mapping of fields.
504After all of the base class fields are added, it adds its own fields
505to the ordered mapping. All of the generated methods will use this
506combined, calculated ordered mapping of fields. Because the fields
507are in insertion order, derived classes override base classes. An
508example::
509
510 @dataclass
511 class Base:
512 x: Any = 15.0
513 y: int = 0
514
515 @dataclass
516 class C(Base):
517 z: int = 10
518 x: int = 15
519
520The final list of fields is, in order, ``x``, ``y``, ``z``. The final
521type of ``x`` is ``int``, as specified in class ``C``.
522
523The generated :meth:`__init__` method for ``C`` will look like::
524
525 def __init__(self, x: int = 15, y: int = 0, z: int = 10):
526
Eric V. Smithc0280532021-04-25 20:42:39 -0400527Re-ordering of keyword-only parameters in __init__
528--------------------------------------------------
529
530After the fields needed for :meth:`__init__` are computed, any
531keyword-only fields are put after regular fields. In this example,
532``Base.y`` and ``D.t`` are keyword-only fields::
533
534 @dataclass
535 class Base:
536 x: Any = 15.0
537 _: KW_ONLY
538 y: int = 0
539
540 @dataclass
541 class D(Base):
542 z: int = 10
543 t: int = field(kw_only=True, default=0)
544
545The generated :meth:`__init__` method for ``D`` will look like::
546
547 def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, t: int = 0):
548
549The relative ordering of keyword-only arguments is not changed from
550the order they are in computed field :meth:`__init__` list.
551
552
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400553Default factory functions
554-------------------------
555
556 If a :func:`field` specifies a ``default_factory``, it is called with
557 zero arguments when a default value for the field is needed. For
558 example, to create a new instance of a list, use::
559
Barry Warsaw713a9362018-05-16 15:50:07 -0400560 mylist: list = field(default_factory=list)
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400561
562 If a field is excluded from :meth:`__init__` (using ``init=False``)
563 and the field also specifies ``default_factory``, then the default
564 factory function will always be called from the generated
565 :meth:`__init__` function. This happens because there is no other
566 way to give the field an initial value.
567
568Mutable default values
569----------------------
570
571 Python stores default member variable values in class attributes.
Barry Warsaw713a9362018-05-16 15:50:07 -0400572 Consider this example, not using dataclasses::
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400573
574 class C:
575 x = []
576 def add(self, element):
Tom Faulknerda5e9472018-07-10 21:39:57 -0500577 self.x.append(element)
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400578
579 o1 = C()
580 o2 = C()
581 o1.add(1)
582 o2.add(2)
583 assert o1.x == [1, 2]
584 assert o1.x is o2.x
585
586 Note that the two instances of class ``C`` share the same class
587 variable ``x``, as expected.
588
Barry Warsaw713a9362018-05-16 15:50:07 -0400589 Using dataclasses, *if* this code was valid::
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400590
591 @dataclass
592 class D:
593 x: List = []
594 def add(self, element):
595 self.x += element
596
597 it would generate code similar to::
598
599 class D:
600 x = []
601 def __init__(self, x=x):
602 self.x = x
603 def add(self, element):
604 self.x += element
605
606 assert D().x is D().x
607
608 This has the same issue as the original example using class ``C``.
609 That is, two instances of class ``D`` that do not specify a value for
610 ``x`` when creating a class instance will share the same copy of
Barry Warsaw713a9362018-05-16 15:50:07 -0400611 ``x``. Because dataclasses just use normal Python class creation
612 they also share this behavior. There is no general way for Data
613 Classes to detect this condition. Instead, dataclasses will raise a
Eric V. Smith98d50cb2018-05-16 04:20:43 -0400614 :exc:`TypeError` if it detects a default parameter of type ``list``,
615 ``dict``, or ``set``. This is a partial solution, but it does protect
616 against many common errors.
617
618 Using default factory functions is a way to create new instances of
619 mutable types as default values for fields::
620
621 @dataclass
622 class D:
623 x: list = field(default_factory=list)
624
625 assert D().x is not D().x
Barry Warsaw713a9362018-05-16 15:50:07 -0400626
627Exceptions
628----------
629
630.. exception:: FrozenInstanceError
631
632 Raised when an implicitly defined :meth:`__setattr__` or
633 :meth:`__delattr__` is called on a dataclass which was defined with
634 ``frozen=True``.