blob: 391f32e11d52a18ee9fe864f2bd78a2ffec36038 [file] [log] [blame]
Eric V. Smith2a7bacb2018-05-15 22:44:27 -04001import re
Eric V. Smithf0db54a2017-12-04 16:58:55 -05002import sys
Eric V. Smithf96ddad2018-03-24 17:20:26 -04003import copy
Eric V. Smithf0db54a2017-12-04 16:58:55 -05004import types
Eric V. Smithf0db54a2017-12-04 16:58:55 -05005import inspect
Eric V. Smith4e812962018-05-16 11:31:29 -04006import keyword
Vadim Pushtaev4d12e4d2018-08-12 14:46:05 +03007import builtins
Srinivas Thatiparthy (శ్రీనివాస్ తాటిపర్తి)dd13c882018-10-19 22:24:50 +05308import functools
9import _thread
10
Eric V. Smithf0db54a2017-12-04 16:58:55 -050011
12__all__ = ['dataclass',
13 'field',
Eric V. Smith8e4560a2018-03-21 17:10:22 -040014 'Field',
Eric V. Smithf0db54a2017-12-04 16:58:55 -050015 'FrozenInstanceError',
16 'InitVar',
Eric V. Smith03220fd2017-12-29 13:59:58 -050017 'MISSING',
Eric V. Smithf0db54a2017-12-04 16:58:55 -050018
19 # Helper functions.
20 'fields',
21 'asdict',
22 'astuple',
23 'make_dataclass',
24 'replace',
Eric V. Smithe7ba0132018-01-06 12:41:53 -050025 'is_dataclass',
Eric V. Smithf0db54a2017-12-04 16:58:55 -050026 ]
27
Eric V. Smithea8fc522018-01-27 19:07:40 -050028# Conditions for adding methods. The boxes indicate what action the
Eric V. Smithf8e75492018-05-16 05:14:53 -040029# dataclass decorator takes. For all of these tables, when I talk
30# about init=, repr=, eq=, order=, unsafe_hash=, or frozen=, I'm
31# referring to the arguments to the @dataclass decorator. When
32# checking if a dunder method already exists, I mean check for an
33# entry in the class's __dict__. I never check to see if an attribute
34# is defined in a base class.
Eric V. Smithea8fc522018-01-27 19:07:40 -050035
36# Key:
37# +=========+=========================================+
38# + Value | Meaning |
39# +=========+=========================================+
40# | <blank> | No action: no method is added. |
41# +---------+-----------------------------------------+
42# | add | Generated method is added. |
43# +---------+-----------------------------------------+
Eric V. Smithea8fc522018-01-27 19:07:40 -050044# | raise | TypeError is raised. |
45# +---------+-----------------------------------------+
46# | None | Attribute is set to None. |
47# +=========+=========================================+
48
49# __init__
50#
51# +--- init= parameter
52# |
53# v | | |
54# | no | yes | <--- class has __init__ in __dict__?
55# +=======+=======+=======+
56# | False | | |
57# +-------+-------+-------+
58# | True | add | | <- the default
59# +=======+=======+=======+
60
61# __repr__
62#
63# +--- repr= parameter
64# |
65# v | | |
66# | no | yes | <--- class has __repr__ in __dict__?
67# +=======+=======+=======+
68# | False | | |
69# +-------+-------+-------+
70# | True | add | | <- the default
71# +=======+=======+=======+
72
73
74# __setattr__
75# __delattr__
76#
77# +--- frozen= parameter
78# |
79# v | | |
80# | no | yes | <--- class has __setattr__ or __delattr__ in __dict__?
81# +=======+=======+=======+
82# | False | | | <- the default
83# +-------+-------+-------+
84# | True | add | raise |
85# +=======+=======+=======+
86# Raise because not adding these methods would break the "frozen-ness"
Eric V. Smithf8e75492018-05-16 05:14:53 -040087# of the class.
Eric V. Smithea8fc522018-01-27 19:07:40 -050088
89# __eq__
90#
91# +--- eq= parameter
92# |
93# v | | |
94# | no | yes | <--- class has __eq__ in __dict__?
95# +=======+=======+=======+
96# | False | | |
97# +-------+-------+-------+
98# | True | add | | <- the default
99# +=======+=======+=======+
100
101# __lt__
102# __le__
103# __gt__
104# __ge__
105#
106# +--- order= parameter
107# |
108# v | | |
109# | no | yes | <--- class has any comparison method in __dict__?
110# +=======+=======+=======+
111# | False | | | <- the default
112# +-------+-------+-------+
113# | True | add | raise |
114# +=======+=======+=======+
115# Raise because to allow this case would interfere with using
Eric V. Smithf8e75492018-05-16 05:14:53 -0400116# functools.total_ordering.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500117
118# __hash__
119
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500120# +------------------- unsafe_hash= parameter
121# | +----------- eq= parameter
122# | | +--- frozen= parameter
123# | | |
124# v v v | | |
125# | no | yes | <--- class has explicitly defined __hash__
126# +=======+=======+=======+========+========+
127# | False | False | False | | | No __eq__, use the base class __hash__
128# +-------+-------+-------+--------+--------+
129# | False | False | True | | | No __eq__, use the base class __hash__
130# +-------+-------+-------+--------+--------+
131# | False | True | False | None | | <-- the default, not hashable
132# +-------+-------+-------+--------+--------+
133# | False | True | True | add | | Frozen, so hashable, allows override
134# +-------+-------+-------+--------+--------+
135# | True | False | False | add | raise | Has no __eq__, but hashable
136# +-------+-------+-------+--------+--------+
137# | True | False | True | add | raise | Has no __eq__, but hashable
138# +-------+-------+-------+--------+--------+
139# | True | True | False | add | raise | Not frozen, but hashable
140# +-------+-------+-------+--------+--------+
141# | True | True | True | add | raise | Frozen, so hashable
142# +=======+=======+=======+========+========+
Eric V. Smithea8fc522018-01-27 19:07:40 -0500143# For boxes that are blank, __hash__ is untouched and therefore
Eric V. Smithf8e75492018-05-16 05:14:53 -0400144# inherited from the base class. If the base is object, then
145# id-based hashing is used.
146#
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400147# Note that a class may already have __hash__=None if it specified an
Eric V. Smithf8e75492018-05-16 05:14:53 -0400148# __eq__ method in the class body (not one that was created by
149# @dataclass).
150#
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500151# See _hash_action (below) for a coded version of this table.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500152
153
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500154# Raised when an attempt is made to modify a frozen class.
155class FrozenInstanceError(AttributeError): pass
156
Eric V. Smithf8e75492018-05-16 05:14:53 -0400157# A sentinel object for default values to signal that a default
158# factory will be used. This is given a nice repr() which will appear
159# in the function signature of dataclasses' constructors.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500160class _HAS_DEFAULT_FACTORY_CLASS:
161 def __repr__(self):
162 return '<factory>'
163_HAS_DEFAULT_FACTORY = _HAS_DEFAULT_FACTORY_CLASS()
164
Eric V. Smith03220fd2017-12-29 13:59:58 -0500165# A sentinel object to detect if a parameter is supplied or not. Use
Eric V. Smithf8e75492018-05-16 05:14:53 -0400166# a class to give it a better repr.
Eric V. Smith03220fd2017-12-29 13:59:58 -0500167class _MISSING_TYPE:
168 pass
169MISSING = _MISSING_TYPE()
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500170
171# Since most per-field metadata will be unused, create an empty
Eric V. Smithf8e75492018-05-16 05:14:53 -0400172# read-only proxy that can be shared among all fields.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500173_EMPTY_METADATA = types.MappingProxyType({})
174
175# Markers for the various kinds of fields and pseudo-fields.
Eric V. Smith01abc6e2018-05-15 08:36:21 -0400176class _FIELD_BASE:
177 def __init__(self, name):
178 self.name = name
179 def __repr__(self):
180 return self.name
181_FIELD = _FIELD_BASE('_FIELD')
182_FIELD_CLASSVAR = _FIELD_BASE('_FIELD_CLASSVAR')
183_FIELD_INITVAR = _FIELD_BASE('_FIELD_INITVAR')
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500184
185# The name of an attribute on the class where we store the Field
Eric V. Smithf8e75492018-05-16 05:14:53 -0400186# objects. Also used to check if a class is a Data Class.
Eric V. Smithf199bc62018-03-18 20:40:34 -0400187_FIELDS = '__dataclass_fields__'
188
189# The name of an attribute on the class that stores the parameters to
190# @dataclass.
191_PARAMS = '__dataclass_params__'
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500192
193# The name of the function, that if it exists, is called at the end of
194# __init__.
195_POST_INIT_NAME = '__post_init__'
196
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400197# String regex that string annotations for ClassVar or InitVar must match.
198# Allows "identifier.identifier[" or "identifier[".
199# https://bugs.python.org/issue33453 for details.
200_MODULE_IDENTIFIER_RE = re.compile(r'^(?:\s*(\w+)\s*\.)?\s*(\w+)')
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500201
202class _InitVarMeta(type):
203 def __getitem__(self, params):
Augusto Hack01ee12b2019-06-02 23:14:48 -0300204 return InitVar(params)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500205
206class InitVar(metaclass=_InitVarMeta):
Augusto Hack01ee12b2019-06-02 23:14:48 -0300207 __slots__ = ('type', )
208
209 def __init__(self, type):
210 self.type = type
211
212 def __repr__(self):
Miss Islington (bot)6da52ac2019-10-13 05:04:05 -0700213 if isinstance(self.type, type):
214 type_name = self.type.__name__
215 else:
216 # typing objects, e.g. List[int]
217 type_name = repr(self.type)
218 return f'dataclasses.InitVar[{type_name}]'
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500219
220
221# Instances of Field are only ever created from within this module,
Eric V. Smithf8e75492018-05-16 05:14:53 -0400222# and only from the field() function, although Field instances are
223# exposed externally as (conceptually) read-only objects.
224#
225# name and type are filled in after the fact, not in __init__.
226# They're not known at the time this class is instantiated, but it's
227# convenient if they're available later.
228#
Eric V. Smithf199bc62018-03-18 20:40:34 -0400229# When cls._FIELDS is filled in with a list of Field objects, the name
Eric V. Smithf8e75492018-05-16 05:14:53 -0400230# and type fields will have been populated.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500231class Field:
232 __slots__ = ('name',
233 'type',
234 'default',
235 'default_factory',
236 'repr',
237 'hash',
238 'init',
239 'compare',
240 'metadata',
241 '_field_type', # Private: not to be used by user code.
242 )
243
244 def __init__(self, default, default_factory, init, repr, hash, compare,
245 metadata):
246 self.name = None
247 self.type = None
248 self.default = default
249 self.default_factory = default_factory
250 self.init = init
251 self.repr = repr
252 self.hash = hash
253 self.compare = compare
254 self.metadata = (_EMPTY_METADATA
Christopher Huntb01786c2019-02-12 06:50:49 -0500255 if metadata is None else
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500256 types.MappingProxyType(metadata))
257 self._field_type = None
258
259 def __repr__(self):
260 return ('Field('
261 f'name={self.name!r},'
Eric V. Smith2473eea2018-05-14 11:37:28 -0400262 f'type={self.type!r},'
263 f'default={self.default!r},'
264 f'default_factory={self.default_factory!r},'
265 f'init={self.init!r},'
266 f'repr={self.repr!r},'
267 f'hash={self.hash!r},'
268 f'compare={self.compare!r},'
Eric V. Smith01abc6e2018-05-15 08:36:21 -0400269 f'metadata={self.metadata!r},'
270 f'_field_type={self._field_type}'
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500271 ')')
272
Eric V. Smithde7a2f02018-03-26 13:29:16 -0400273 # This is used to support the PEP 487 __set_name__ protocol in the
Eric V. Smithf8e75492018-05-16 05:14:53 -0400274 # case where we're using a field that contains a descriptor as a
Artjome55ca3f2018-07-06 02:09:13 +0300275 # default value. For details on __set_name__, see
Eric V. Smithf8e75492018-05-16 05:14:53 -0400276 # https://www.python.org/dev/peps/pep-0487/#implementation-details.
277 #
278 # Note that in _process_class, this Field object is overwritten
279 # with the default value, so the end result is a descriptor that
280 # had __set_name__ called on it at the right time.
Eric V. Smithde7a2f02018-03-26 13:29:16 -0400281 def __set_name__(self, owner, name):
Eric V. Smith52199522018-03-29 11:07:48 -0400282 func = getattr(type(self.default), '__set_name__', None)
Eric V. Smithde7a2f02018-03-26 13:29:16 -0400283 if func:
Eric V. Smithf8e75492018-05-16 05:14:53 -0400284 # There is a __set_name__ method on the descriptor, call
285 # it.
Eric V. Smith52199522018-03-29 11:07:48 -0400286 func(self.default, owner, name)
Eric V. Smithde7a2f02018-03-26 13:29:16 -0400287
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500288
Eric V. Smithf199bc62018-03-18 20:40:34 -0400289class _DataclassParams:
290 __slots__ = ('init',
291 'repr',
292 'eq',
293 'order',
294 'unsafe_hash',
295 'frozen',
296 )
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400297
Eric V. Smithf199bc62018-03-18 20:40:34 -0400298 def __init__(self, init, repr, eq, order, unsafe_hash, frozen):
299 self.init = init
300 self.repr = repr
301 self.eq = eq
302 self.order = order
303 self.unsafe_hash = unsafe_hash
304 self.frozen = frozen
305
306 def __repr__(self):
307 return ('_DataclassParams('
Eric V. Smith30590422018-05-14 17:16:52 -0400308 f'init={self.init!r},'
309 f'repr={self.repr!r},'
310 f'eq={self.eq!r},'
311 f'order={self.order!r},'
312 f'unsafe_hash={self.unsafe_hash!r},'
313 f'frozen={self.frozen!r}'
Eric V. Smithf199bc62018-03-18 20:40:34 -0400314 ')')
315
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400316
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500317# This function is used instead of exposing Field creation directly,
Eric V. Smithf8e75492018-05-16 05:14:53 -0400318# so that a type checker can be told (via overloads) that this is a
319# function whose type depends on its parameters.
Eric V. Smith03220fd2017-12-29 13:59:58 -0500320def field(*, default=MISSING, default_factory=MISSING, init=True, repr=True,
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500321 hash=None, compare=True, metadata=None):
322 """Return an object to identify dataclass fields.
323
Eric V. Smithf8e75492018-05-16 05:14:53 -0400324 default is the default value of the field. default_factory is a
325 0-argument function called to initialize a field's value. If init
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500326 is True, the field will be a parameter to the class's __init__()
Eric V. Smithf8e75492018-05-16 05:14:53 -0400327 function. If repr is True, the field will be included in the
328 object's repr(). If hash is True, the field will be included in
329 the object's hash(). If compare is True, the field will be used
330 in comparison functions. metadata, if specified, must be a
331 mapping which is stored but not otherwise examined by dataclass.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500332
333 It is an error to specify both default and default_factory.
334 """
335
Eric V. Smith03220fd2017-12-29 13:59:58 -0500336 if default is not MISSING and default_factory is not MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500337 raise ValueError('cannot specify both default and default_factory')
338 return Field(default, default_factory, init, repr, hash, compare,
339 metadata)
340
341
342def _tuple_str(obj_name, fields):
343 # Return a string representing each field of obj_name as a tuple
Eric V. Smithf8e75492018-05-16 05:14:53 -0400344 # member. So, if fields is ['x', 'y'] and obj_name is "self",
345 # return "(self.x,self.y)".
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500346
347 # Special case for the 0-tuple.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500348 if not fields:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500349 return '()'
350 # Note the trailing comma, needed if this turns out to be a 1-tuple.
351 return f'({",".join([f"{obj_name}.{f.name}" for f in fields])},)'
352
353
Srinivas Thatiparthy (శ్రీనివాస్ తాటిపర్తి)dd13c882018-10-19 22:24:50 +0530354# This function's logic is copied from "recursive_repr" function in
355# reprlib module to avoid dependency.
356def _recursive_repr(user_function):
357 # Decorator to make a repr function return "..." for a recursive
358 # call.
359 repr_running = set()
360
361 @functools.wraps(user_function)
362 def wrapper(self):
363 key = id(self), _thread.get_ident()
364 if key in repr_running:
365 return '...'
366 repr_running.add(key)
367 try:
368 result = user_function(self)
369 finally:
370 repr_running.discard(key)
371 return result
372 return wrapper
373
374
Eric V. Smithea8fc522018-01-27 19:07:40 -0500375def _create_fn(name, args, body, *, globals=None, locals=None,
Eric V. Smith03220fd2017-12-29 13:59:58 -0500376 return_type=MISSING):
Eric V. Smithf8e75492018-05-16 05:14:53 -0400377 # Note that we mutate locals when exec() is called. Caller
378 # beware! The only callers are internal to this module, so no
379 # worries about external callers.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500380 if locals is None:
381 locals = {}
Vadim Pushtaev4d12e4d2018-08-12 14:46:05 +0300382 # __builtins__ may be the "builtins" module or
383 # the value of its "__dict__",
384 # so make sure "__builtins__" is the module.
385 if globals is not None and '__builtins__' not in globals:
386 globals['__builtins__'] = builtins
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500387 return_annotation = ''
Eric V. Smith03220fd2017-12-29 13:59:58 -0500388 if return_type is not MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500389 locals['_return_type'] = return_type
390 return_annotation = '->_return_type'
391 args = ','.join(args)
392 body = '\n'.join(f' {b}' for b in body)
393
Eric V. Smithf199bc62018-03-18 20:40:34 -0400394 # Compute the text of the entire function.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500395 txt = f'def {name}({args}){return_annotation}:\n{body}'
396
397 exec(txt, globals, locals)
398 return locals[name]
399
400
401def _field_assign(frozen, name, value, self_name):
402 # If we're a frozen class, then assign to our fields in __init__
Eric V. Smithf8e75492018-05-16 05:14:53 -0400403 # via object.__setattr__. Otherwise, just use a simple
404 # assignment.
405 #
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500406 # self_name is what "self" is called in this function: don't
Eric V. Smithf8e75492018-05-16 05:14:53 -0400407 # hard-code "self", since that might be a field name.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500408 if frozen:
Vadim Pushtaev4d12e4d2018-08-12 14:46:05 +0300409 return f'__builtins__.object.__setattr__({self_name},{name!r},{value})'
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500410 return f'{self_name}.{name}={value}'
411
412
413def _field_init(f, frozen, globals, self_name):
414 # Return the text of the line in the body of __init__ that will
Eric V. Smithf8e75492018-05-16 05:14:53 -0400415 # initialize this field.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500416
417 default_name = f'_dflt_{f.name}'
Eric V. Smith03220fd2017-12-29 13:59:58 -0500418 if f.default_factory is not MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500419 if f.init:
420 # This field has a default factory. If a parameter is
Eric V. Smithf8e75492018-05-16 05:14:53 -0400421 # given, use it. If not, call the factory.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500422 globals[default_name] = f.default_factory
423 value = (f'{default_name}() '
424 f'if {f.name} is _HAS_DEFAULT_FACTORY '
425 f'else {f.name}')
426 else:
427 # This is a field that's not in the __init__ params, but
Eric V. Smithf8e75492018-05-16 05:14:53 -0400428 # has a default factory function. It needs to be
429 # initialized here by calling the factory function,
430 # because there's no other way to initialize it.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500431
432 # For a field initialized with a default=defaultvalue, the
Eric V. Smithf8e75492018-05-16 05:14:53 -0400433 # class dict just has the default value
434 # (cls.fieldname=defaultvalue). But that won't work for a
435 # default factory, the factory must be called in __init__
436 # and we must assign that to self.fieldname. We can't
437 # fall back to the class dict's value, both because it's
438 # not set, and because it might be different per-class
439 # (which, after all, is why we have a factory function!).
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500440
441 globals[default_name] = f.default_factory
442 value = f'{default_name}()'
443 else:
444 # No default factory.
445 if f.init:
Eric V. Smith03220fd2017-12-29 13:59:58 -0500446 if f.default is MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500447 # There's no default, just do an assignment.
448 value = f.name
Eric V. Smith03220fd2017-12-29 13:59:58 -0500449 elif f.default is not MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500450 globals[default_name] = f.default
451 value = f.name
452 else:
Eric V. Smithf8e75492018-05-16 05:14:53 -0400453 # This field does not need initialization. Signify that
454 # to the caller by returning None.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500455 return None
456
457 # Only test this now, so that we can create variables for the
Eric V. Smithf8e75492018-05-16 05:14:53 -0400458 # default. However, return None to signify that we're not going
459 # to actually do the assignment statement for InitVars.
Eric V. Smithe7adf2b2018-06-07 14:43:59 -0400460 if f._field_type is _FIELD_INITVAR:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500461 return None
462
463 # Now, actually generate the field assignment.
464 return _field_assign(frozen, f.name, value, self_name)
465
466
467def _init_param(f):
Eric V. Smithf8e75492018-05-16 05:14:53 -0400468 # Return the __init__ parameter string for this field. For
469 # example, the equivalent of 'x:int=3' (except instead of 'int',
470 # reference a variable set to int, and instead of '3', reference a
471 # variable set to 3).
Eric V. Smith03220fd2017-12-29 13:59:58 -0500472 if f.default is MISSING and f.default_factory is MISSING:
Eric V. Smithf8e75492018-05-16 05:14:53 -0400473 # There's no default, and no default_factory, just output the
474 # variable name and type.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500475 default = ''
Eric V. Smith03220fd2017-12-29 13:59:58 -0500476 elif f.default is not MISSING:
Eric V. Smithf8e75492018-05-16 05:14:53 -0400477 # There's a default, this will be the name that's used to look
478 # it up.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500479 default = f'=_dflt_{f.name}'
Eric V. Smith03220fd2017-12-29 13:59:58 -0500480 elif f.default_factory is not MISSING:
Eric V. Smithf8e75492018-05-16 05:14:53 -0400481 # There's a factory function. Set a marker.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500482 default = '=_HAS_DEFAULT_FACTORY'
483 return f'{f.name}:_type_{f.name}{default}'
484
485
486def _init_fn(fields, frozen, has_post_init, self_name):
487 # fields contains both real fields and InitVar pseudo-fields.
488
489 # Make sure we don't have fields without defaults following fields
Eric V. Smithf8e75492018-05-16 05:14:53 -0400490 # with defaults. This actually would be caught when exec-ing the
491 # function source code, but catching it here gives a better error
492 # message, and future-proofs us in case we build up the function
493 # using ast.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500494 seen_default = False
495 for f in fields:
496 # Only consider fields in the __init__ call.
497 if f.init:
Eric V. Smith03220fd2017-12-29 13:59:58 -0500498 if not (f.default is MISSING and f.default_factory is MISSING):
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500499 seen_default = True
500 elif seen_default:
501 raise TypeError(f'non-default argument {f.name!r} '
502 'follows default argument')
503
Eric V. Smith03220fd2017-12-29 13:59:58 -0500504 globals = {'MISSING': MISSING,
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500505 '_HAS_DEFAULT_FACTORY': _HAS_DEFAULT_FACTORY}
506
507 body_lines = []
508 for f in fields:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500509 line = _field_init(f, frozen, globals, self_name)
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400510 # line is None means that this field doesn't require
Eric V. Smithf8e75492018-05-16 05:14:53 -0400511 # initialization (it's a pseudo-field). Just skip it.
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400512 if line:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500513 body_lines.append(line)
514
515 # Does this class have a post-init function?
516 if has_post_init:
517 params_str = ','.join(f.name for f in fields
518 if f._field_type is _FIELD_INITVAR)
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400519 body_lines.append(f'{self_name}.{_POST_INIT_NAME}({params_str})')
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500520
521 # If no body lines, use 'pass'.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500522 if not body_lines:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500523 body_lines = ['pass']
524
525 locals = {f'_type_{f.name}': f.type for f in fields}
526 return _create_fn('__init__',
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400527 [self_name] + [_init_param(f) for f in fields if f.init],
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500528 body_lines,
529 locals=locals,
530 globals=globals,
531 return_type=None)
532
533
534def _repr_fn(fields):
Srinivas Thatiparthy (శ్రీనివాస్ తాటిపర్తి)dd13c882018-10-19 22:24:50 +0530535 fn = _create_fn('__repr__',
536 ('self',),
537 ['return self.__class__.__qualname__ + f"(' +
538 ', '.join([f"{f.name}={{self.{f.name}!r}}"
539 for f in fields]) +
540 ')"'])
541 return _recursive_repr(fn)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500542
543
Eric V. Smithf199bc62018-03-18 20:40:34 -0400544def _frozen_get_del_attr(cls, fields):
Eric V. Smithf8e75492018-05-16 05:14:53 -0400545 # XXX: globals is modified on the first call to _create_fn, then
546 # the modified version is used in the second call. Is this okay?
Eric V. Smithf199bc62018-03-18 20:40:34 -0400547 globals = {'cls': cls,
548 'FrozenInstanceError': FrozenInstanceError}
549 if fields:
550 fields_str = '(' + ','.join(repr(f.name) for f in fields) + ',)'
551 else:
552 # Special case for the zero-length tuple.
553 fields_str = '()'
554 return (_create_fn('__setattr__',
555 ('self', 'name', 'value'),
556 (f'if type(self) is cls or name in {fields_str}:',
557 ' raise FrozenInstanceError(f"cannot assign to field {name!r}")',
558 f'super(cls, self).__setattr__(name, value)'),
559 globals=globals),
560 _create_fn('__delattr__',
561 ('self', 'name'),
562 (f'if type(self) is cls or name in {fields_str}:',
563 ' raise FrozenInstanceError(f"cannot delete field {name!r}")',
564 f'super(cls, self).__delattr__(name)'),
565 globals=globals),
566 )
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500567
568
569def _cmp_fn(name, op, self_tuple, other_tuple):
570 # Create a comparison function. If the fields in the object are
Eric V. Smithf8e75492018-05-16 05:14:53 -0400571 # named 'x' and 'y', then self_tuple is the string
572 # '(self.x,self.y)' and other_tuple is the string
573 # '(other.x,other.y)'.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500574
575 return _create_fn(name,
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400576 ('self', 'other'),
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500577 [ 'if other.__class__ is self.__class__:',
578 f' return {self_tuple}{op}{other_tuple}',
579 'return NotImplemented'])
580
581
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500582def _hash_fn(fields):
583 self_tuple = _tuple_str('self', fields)
584 return _create_fn('__hash__',
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400585 ('self',),
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500586 [f'return hash({self_tuple})'])
587
588
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400589def _is_classvar(a_type, typing):
Eric V. Smith92858352018-05-16 07:24:00 -0400590 # This test uses a typing internal class, but it's the best way to
591 # test if this is a ClassVar.
592 return (a_type is typing.ClassVar
593 or (type(a_type) is typing._GenericAlias
594 and a_type.__origin__ is typing.ClassVar))
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400595
596
597def _is_initvar(a_type, dataclasses):
598 # The module we're checking against is the module we're
599 # currently in (dataclasses.py).
Augusto Hack01ee12b2019-06-02 23:14:48 -0300600 return (a_type is dataclasses.InitVar
601 or type(a_type) is dataclasses.InitVar)
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400602
603
604def _is_type(annotation, cls, a_module, a_type, is_type_predicate):
605 # Given a type annotation string, does it refer to a_type in
606 # a_module? For example, when checking that annotation denotes a
607 # ClassVar, then a_module is typing, and a_type is
608 # typing.ClassVar.
609
610 # It's possible to look up a_module given a_type, but it involves
611 # looking in sys.modules (again!), and seems like a waste since
612 # the caller already knows a_module.
613
614 # - annotation is a string type annotation
615 # - cls is the class that this annotation was found in
616 # - a_module is the module we want to match
617 # - a_type is the type in that module we want to match
618 # - is_type_predicate is a function called with (obj, a_module)
619 # that determines if obj is of the desired type.
620
621 # Since this test does not do a local namespace lookup (and
622 # instead only a module (global) lookup), there are some things it
623 # gets wrong.
624
Eric V. Smithf8e75492018-05-16 05:14:53 -0400625 # With string annotations, cv0 will be detected as a ClassVar:
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400626 # CV = ClassVar
627 # @dataclass
628 # class C0:
629 # cv0: CV
630
Eric V. Smithf8e75492018-05-16 05:14:53 -0400631 # But in this example cv1 will not be detected as a ClassVar:
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400632 # @dataclass
633 # class C1:
634 # CV = ClassVar
635 # cv1: CV
636
Eric V. Smithf8e75492018-05-16 05:14:53 -0400637 # In C1, the code in this function (_is_type) will look up "CV" in
638 # the module and not find it, so it will not consider cv1 as a
639 # ClassVar. This is a fairly obscure corner case, and the best
640 # way to fix it would be to eval() the string "CV" with the
641 # correct global and local namespaces. However that would involve
642 # a eval() penalty for every single field of every dataclass
643 # that's defined. It was judged not worth it.
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400644
645 match = _MODULE_IDENTIFIER_RE.match(annotation)
646 if match:
647 ns = None
648 module_name = match.group(1)
649 if not module_name:
650 # No module name, assume the class's module did
651 # "from dataclasses import InitVar".
652 ns = sys.modules.get(cls.__module__).__dict__
653 else:
654 # Look up module_name in the class's module.
655 module = sys.modules.get(cls.__module__)
656 if module and module.__dict__.get(module_name) is a_module:
657 ns = sys.modules.get(a_type.__module__).__dict__
658 if ns and is_type_predicate(ns.get(match.group(2)), a_module):
659 return True
660 return False
661
662
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500663def _get_field(cls, a_name, a_type):
Eric V. Smithf96ddad2018-03-24 17:20:26 -0400664 # Return a Field object for this field name and type. ClassVars
Eric V. Smithf8e75492018-05-16 05:14:53 -0400665 # and InitVars are also returned, but marked as such (see
666 # f._field_type).
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500667
Eric V. Smithf8e75492018-05-16 05:14:53 -0400668 # If the default value isn't derived from Field, then it's only a
669 # normal default value. Convert it to a Field().
Eric V. Smith03220fd2017-12-29 13:59:58 -0500670 default = getattr(cls, a_name, MISSING)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500671 if isinstance(default, Field):
672 f = default
673 else:
Eric V. Smith7389fd92018-03-19 21:07:51 -0400674 if isinstance(default, types.MemberDescriptorType):
675 # This is a field in __slots__, so it has no default value.
676 default = MISSING
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500677 f = field(default=default)
678
Eric V. Smithf8e75492018-05-16 05:14:53 -0400679 # Only at this point do we know the name and the type. Set them.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500680 f.name = a_name
681 f.type = a_type
682
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400683 # Assume it's a normal field until proven otherwise. We're next
Eric V. Smithf8e75492018-05-16 05:14:53 -0400684 # going to decide if it's a ClassVar or InitVar, everything else
685 # is just a normal field.
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400686 f._field_type = _FIELD
687
688 # In addition to checking for actual types here, also check for
Eric V. Smithf8e75492018-05-16 05:14:53 -0400689 # string annotations. get_type_hints() won't always work for us
690 # (see https://github.com/python/typing/issues/508 for example),
691 # plus it's expensive and would require an eval for every stirng
692 # annotation. So, make a best effort to see if this is a ClassVar
693 # or InitVar using regex's and checking that the thing referenced
694 # is actually of the correct type.
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400695
696 # For the complete discussion, see https://bugs.python.org/issue33453
697
698 # If typing has not been imported, then it's impossible for any
Eric V. Smithf8e75492018-05-16 05:14:53 -0400699 # annotation to be a ClassVar. So, only look for ClassVar if
700 # typing has been imported by any module (not necessarily cls's
701 # module).
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500702 typing = sys.modules.get('typing')
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400703 if typing:
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400704 if (_is_classvar(a_type, typing)
705 or (isinstance(f.type, str)
706 and _is_type(f.type, cls, typing, typing.ClassVar,
707 _is_classvar))):
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500708 f._field_type = _FIELD_CLASSVAR
709
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400710 # If the type is InitVar, or if it's a matching string annotation,
711 # then it's an InitVar.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500712 if f._field_type is _FIELD:
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400713 # The module we're checking against is the module we're
714 # currently in (dataclasses.py).
715 dataclasses = sys.modules[__name__]
716 if (_is_initvar(a_type, dataclasses)
717 or (isinstance(f.type, str)
718 and _is_type(f.type, cls, dataclasses, dataclasses.InitVar,
719 _is_initvar))):
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500720 f._field_type = _FIELD_INITVAR
721
Eric V. Smith2a7bacb2018-05-15 22:44:27 -0400722 # Validations for individual fields. This is delayed until now,
723 # instead of in the Field() constructor, since only here do we
724 # know the field name, which allows for better error reporting.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500725
726 # Special restrictions for ClassVar and InitVar.
727 if f._field_type in (_FIELD_CLASSVAR, _FIELD_INITVAR):
Eric V. Smith03220fd2017-12-29 13:59:58 -0500728 if f.default_factory is not MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500729 raise TypeError(f'field {f.name} cannot have a '
730 'default factory')
731 # Should I check for other field settings? default_factory
Eric V. Smithf8e75492018-05-16 05:14:53 -0400732 # seems the most serious to check for. Maybe add others. For
733 # example, how about init=False (or really,
734 # init=<not-the-default-init-value>)? It makes no sense for
735 # ClassVar and InitVar to specify init=<anything>.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500736
737 # For real fields, disallow mutable defaults for known types.
738 if f._field_type is _FIELD and isinstance(f.default, (list, dict, set)):
739 raise ValueError(f'mutable default {type(f.default)} for field '
740 f'{f.name} is not allowed: use default_factory')
741
742 return f
743
744
Eric V. Smithea8fc522018-01-27 19:07:40 -0500745def _set_new_attribute(cls, name, value):
746 # Never overwrites an existing attribute. Returns True if the
Eric V. Smithf8e75492018-05-16 05:14:53 -0400747 # attribute already exists.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500748 if name in cls.__dict__:
Eric V. Smithea8fc522018-01-27 19:07:40 -0500749 return True
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500750 setattr(cls, name, value)
Eric V. Smithea8fc522018-01-27 19:07:40 -0500751 return False
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500752
753
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500754# Decide if/how we're going to create a hash function. Key is
Eric V. Smithf8e75492018-05-16 05:14:53 -0400755# (unsafe_hash, eq, frozen, does-hash-exist). Value is the action to
756# take. The common case is to do nothing, so instead of providing a
757# function that is a no-op, use None to signify that.
Eric V. Smith01d618c2018-03-24 22:10:14 -0400758
759def _hash_set_none(cls, fields):
760 return None
761
762def _hash_add(cls, fields):
763 flds = [f for f in fields if (f.compare if f.hash is None else f.hash)]
764 return _hash_fn(flds)
765
766def _hash_exception(cls, fields):
767 # Raise an exception.
768 raise TypeError(f'Cannot overwrite attribute __hash__ '
769 f'in class {cls.__name__}')
770
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500771#
772# +-------------------------------------- unsafe_hash?
773# | +------------------------------- eq?
774# | | +------------------------ frozen?
775# | | | +---------------- has-explicit-hash?
776# | | | |
777# | | | | +------- action
778# | | | | |
779# v v v v v
Eric V. Smith01d618c2018-03-24 22:10:14 -0400780_hash_action = {(False, False, False, False): None,
781 (False, False, False, True ): None,
782 (False, False, True, False): None,
783 (False, False, True, True ): None,
784 (False, True, False, False): _hash_set_none,
785 (False, True, False, True ): None,
786 (False, True, True, False): _hash_add,
787 (False, True, True, True ): None,
788 (True, False, False, False): _hash_add,
789 (True, False, False, True ): _hash_exception,
790 (True, False, True, False): _hash_add,
791 (True, False, True, True ): _hash_exception,
792 (True, True, False, False): _hash_add,
793 (True, True, False, True ): _hash_exception,
794 (True, True, True, False): _hash_add,
795 (True, True, True, True ): _hash_exception,
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500796 }
797# See https://bugs.python.org/issue32929#msg312829 for an if-statement
Eric V. Smithf8e75492018-05-16 05:14:53 -0400798# version of this table.
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500799
800
Eric V. Smithf199bc62018-03-18 20:40:34 -0400801def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen):
Eric V. Smithd1388922018-01-07 14:30:17 -0500802 # Now that dicts retain insertion order, there's no reason to use
Eric V. Smithf8e75492018-05-16 05:14:53 -0400803 # an ordered dict. I am leveraging that ordering here, because
804 # derived class fields overwrite base class fields, but the order
805 # is defined by the base class, which is found first.
Eric V. Smithd1388922018-01-07 14:30:17 -0500806 fields = {}
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500807
Eric V. Smithf199bc62018-03-18 20:40:34 -0400808 setattr(cls, _PARAMS, _DataclassParams(init, repr, eq, order,
809 unsafe_hash, frozen))
810
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500811 # Find our base classes in reverse MRO order, and exclude
Eric V. Smithf8e75492018-05-16 05:14:53 -0400812 # ourselves. In reversed order so that more derived classes
813 # override earlier field definitions in base classes. As long as
814 # we're iterating over them, see if any are frozen.
Eric V. Smithf199bc62018-03-18 20:40:34 -0400815 any_frozen_base = False
816 has_dataclass_bases = False
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500817 for b in cls.__mro__[-1:0:-1]:
818 # Only process classes that have been processed by our
Eric V. Smithf8e75492018-05-16 05:14:53 -0400819 # decorator. That is, they have a _FIELDS attribute.
Eric V. Smithf199bc62018-03-18 20:40:34 -0400820 base_fields = getattr(b, _FIELDS, None)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500821 if base_fields:
Eric V. Smithf199bc62018-03-18 20:40:34 -0400822 has_dataclass_bases = True
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500823 for f in base_fields.values():
824 fields[f.name] = f
Eric V. Smithf199bc62018-03-18 20:40:34 -0400825 if getattr(b, _PARAMS).frozen:
826 any_frozen_base = True
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500827
Eric V. Smith56970b82018-03-22 16:28:48 -0400828 # Annotations that are defined in this class (not in base
Eric V. Smithf8e75492018-05-16 05:14:53 -0400829 # classes). If __annotations__ isn't present, then this class
830 # adds no new annotations. We use this to compute fields that are
831 # added by this class.
832 #
Eric V. Smith56970b82018-03-22 16:28:48 -0400833 # Fields are found from cls_annotations, which is guaranteed to be
Eric V. Smithf8e75492018-05-16 05:14:53 -0400834 # ordered. Default values are from class attributes, if a field
835 # has a default. If the default value is a Field(), then it
836 # contains additional info beyond (and possibly including) the
837 # actual default value. Pseudo-fields ClassVars and InitVars are
838 # included, despite the fact that they're not real fields. That's
839 # dealt with later.
Eric V. Smith56970b82018-03-22 16:28:48 -0400840 cls_annotations = cls.__dict__.get('__annotations__', {})
841
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500842 # Now find fields in our class. While doing so, validate some
Eric V. Smithf8e75492018-05-16 05:14:53 -0400843 # things, and set the default values (as class attributes) where
844 # we can.
Eric V. Smith56970b82018-03-22 16:28:48 -0400845 cls_fields = [_get_field(cls, name, type)
846 for name, type in cls_annotations.items()]
847 for f in cls_fields:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500848 fields[f.name] = f
849
Eric V. Smithf8e75492018-05-16 05:14:53 -0400850 # If the class attribute (which is the default value for this
851 # field) exists and is of type 'Field', replace it with the
852 # real default. This is so that normal class introspection
853 # sees a real default value, not a Field.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500854 if isinstance(getattr(cls, f.name, None), Field):
Eric V. Smith03220fd2017-12-29 13:59:58 -0500855 if f.default is MISSING:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500856 # If there's no default, delete the class attribute.
Eric V. Smithf8e75492018-05-16 05:14:53 -0400857 # This happens if we specify field(repr=False), for
858 # example (that is, we specified a field object, but
859 # no default value). Also if we're using a default
860 # factory. The class attribute should not be set at
861 # all in the post-processed class.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500862 delattr(cls, f.name)
863 else:
864 setattr(cls, f.name, f.default)
865
Eric V. Smith56970b82018-03-22 16:28:48 -0400866 # Do we have any Field members that don't also have annotations?
867 for name, value in cls.__dict__.items():
868 if isinstance(value, Field) and not name in cls_annotations:
869 raise TypeError(f'{name!r} is a field but has no type annotation')
870
Eric V. Smithf199bc62018-03-18 20:40:34 -0400871 # Check rules that apply if we are derived from any dataclasses.
872 if has_dataclass_bases:
873 # Raise an exception if any of our bases are frozen, but we're not.
874 if any_frozen_base and not frozen:
875 raise TypeError('cannot inherit non-frozen dataclass from a '
876 'frozen one')
Eric V. Smith2fa6b9e2018-02-26 20:38:33 -0500877
Eric V. Smithf199bc62018-03-18 20:40:34 -0400878 # Raise an exception if we're frozen, but none of our bases are.
879 if not any_frozen_base and frozen:
880 raise TypeError('cannot inherit frozen dataclass from a '
881 'non-frozen one')
Eric V. Smith2fa6b9e2018-02-26 20:38:33 -0500882
Eric V. Smithf8e75492018-05-16 05:14:53 -0400883 # Remember all of the fields on our class (including bases). This
884 # also marks this class as being a dataclass.
Eric V. Smithf199bc62018-03-18 20:40:34 -0400885 setattr(cls, _FIELDS, fields)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500886
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500887 # Was this class defined with an explicit __hash__? Note that if
Eric V. Smithf8e75492018-05-16 05:14:53 -0400888 # __eq__ is defined in this class, then python will automatically
889 # set __hash__ to None. This is a heuristic, as it's possible
890 # that such a __hash__ == None was not auto-generated, but it
891 # close enough.
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500892 class_hash = cls.__dict__.get('__hash__', MISSING)
893 has_explicit_hash = not (class_hash is MISSING or
894 (class_hash is None and '__eq__' in cls.__dict__))
Eric V. Smithea8fc522018-01-27 19:07:40 -0500895
Eric V. Smithf8e75492018-05-16 05:14:53 -0400896 # If we're generating ordering methods, we must be generating the
897 # eq methods.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500898 if order and not eq:
899 raise ValueError('eq must be true if order is true')
900
901 if init:
902 # Does this class have a post-init function?
903 has_post_init = hasattr(cls, _POST_INIT_NAME)
904
905 # Include InitVars and regular fields (so, not ClassVars).
Eric V. Smithea8fc522018-01-27 19:07:40 -0500906 flds = [f for f in fields.values()
907 if f._field_type in (_FIELD, _FIELD_INITVAR)]
908 _set_new_attribute(cls, '__init__',
909 _init_fn(flds,
Eric V. Smith2fa6b9e2018-02-26 20:38:33 -0500910 frozen,
Eric V. Smithea8fc522018-01-27 19:07:40 -0500911 has_post_init,
Eric V. Smithf8e75492018-05-16 05:14:53 -0400912 # The name to use for the "self"
913 # param in __init__. Use "self"
914 # if possible.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500915 '__dataclass_self__' if 'self' in fields
916 else 'self',
917 ))
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500918
919 # Get the fields as a list, and include only real fields. This is
Eric V. Smithf8e75492018-05-16 05:14:53 -0400920 # used in all of the following methods.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500921 field_list = [f for f in fields.values() if f._field_type is _FIELD]
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500922
923 if repr:
Eric V. Smithea8fc522018-01-27 19:07:40 -0500924 flds = [f for f in field_list if f.repr]
925 _set_new_attribute(cls, '__repr__', _repr_fn(flds))
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500926
927 if eq:
Eric V. Smithea8fc522018-01-27 19:07:40 -0500928 # Create _eq__ method. There's no need for a __ne__ method,
Eric V. Smithf8e75492018-05-16 05:14:53 -0400929 # since python will call __eq__ and negate it.
Eric V. Smithea8fc522018-01-27 19:07:40 -0500930 flds = [f for f in field_list if f.compare]
931 self_tuple = _tuple_str('self', flds)
932 other_tuple = _tuple_str('other', flds)
933 _set_new_attribute(cls, '__eq__',
934 _cmp_fn('__eq__', '==',
935 self_tuple, other_tuple))
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500936
937 if order:
Eric V. Smithea8fc522018-01-27 19:07:40 -0500938 # Create and set the ordering methods.
939 flds = [f for f in field_list if f.compare]
940 self_tuple = _tuple_str('self', flds)
941 other_tuple = _tuple_str('other', flds)
942 for name, op in [('__lt__', '<'),
943 ('__le__', '<='),
944 ('__gt__', '>'),
945 ('__ge__', '>='),
946 ]:
947 if _set_new_attribute(cls, name,
948 _cmp_fn(name, op, self_tuple, other_tuple)):
949 raise TypeError(f'Cannot overwrite attribute {name} '
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500950 f'in class {cls.__name__}. Consider using '
Eric V. Smithea8fc522018-01-27 19:07:40 -0500951 'functools.total_ordering')
952
Eric V. Smith2fa6b9e2018-02-26 20:38:33 -0500953 if frozen:
Eric V. Smithf199bc62018-03-18 20:40:34 -0400954 for fn in _frozen_get_del_attr(cls, field_list):
955 if _set_new_attribute(cls, fn.__name__, fn):
956 raise TypeError(f'Cannot overwrite attribute {fn.__name__} '
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500957 f'in class {cls.__name__}')
Eric V. Smithea8fc522018-01-27 19:07:40 -0500958
959 # Decide if/how we're going to create a hash function.
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500960 hash_action = _hash_action[bool(unsafe_hash),
961 bool(eq),
962 bool(frozen),
963 has_explicit_hash]
Eric V. Smith01d618c2018-03-24 22:10:14 -0400964 if hash_action:
965 # No need to call _set_new_attribute here, since by the time
Eric V. Smithf8e75492018-05-16 05:14:53 -0400966 # we're here the overwriting is unconditional.
Eric V. Smith01d618c2018-03-24 22:10:14 -0400967 cls.__hash__ = hash_action(cls, field_list)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500968
969 if not getattr(cls, '__doc__'):
970 # Create a class doc-string.
971 cls.__doc__ = (cls.__name__ +
972 str(inspect.signature(cls)).replace(' -> None', ''))
973
974 return cls
975
976
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300977def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False,
Eric V. Smith5da8cfb2018-03-01 08:01:41 -0500978 unsafe_hash=False, frozen=False):
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500979 """Returns the same class as was passed in, with dunder methods
980 added based on the fields defined in the class.
981
982 Examines PEP 526 __annotations__ to determine fields.
983
984 If init is true, an __init__() method is added to the class. If
985 repr is true, a __repr__() method is added. If order is true, rich
Eric V. Smithdbf9cff2018-02-25 21:30:17 -0500986 comparison dunder methods are added. If unsafe_hash is true, a
987 __hash__() method function is added. If frozen is true, fields may
988 not be assigned to after instance creation.
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500989 """
990
991 def wrap(cls):
Eric V. Smithf199bc62018-03-18 20:40:34 -0400992 return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500993
994 # See if we're being called as @dataclass or @dataclass().
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300995 if cls is None:
Eric V. Smithf0db54a2017-12-04 16:58:55 -0500996 # We're called with parens.
997 return wrap
998
999 # We're called as @dataclass without parens.
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001000 return wrap(cls)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001001
1002
1003def fields(class_or_instance):
1004 """Return a tuple describing the fields of this dataclass.
1005
1006 Accepts a dataclass or an instance of one. Tuple elements are of
1007 type Field.
1008 """
1009
1010 # Might it be worth caching this, per class?
1011 try:
Eric V. Smith2a7bacb2018-05-15 22:44:27 -04001012 fields = getattr(class_or_instance, _FIELDS)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001013 except AttributeError:
1014 raise TypeError('must be called with a dataclass type or instance')
1015
Eric V. Smithd1388922018-01-07 14:30:17 -05001016 # Exclude pseudo-fields. Note that fields is sorted by insertion
Eric V. Smithf8e75492018-05-16 05:14:53 -04001017 # order, so the order of the tuple is as the fields were defined.
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001018 return tuple(f for f in fields.values() if f._field_type is _FIELD)
1019
1020
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001021def _is_dataclass_instance(obj):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001022 """Returns True if obj is an instance of a dataclass."""
Miss Islington (bot)1271ee82019-08-19 22:59:21 -07001023 return hasattr(type(obj), _FIELDS)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001024
1025
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001026def is_dataclass(obj):
1027 """Returns True if obj is a dataclass or an instance of a
1028 dataclass."""
Miss Islington (bot)1271ee82019-08-19 22:59:21 -07001029 cls = obj if isinstance(obj, type) else type(obj)
1030 return hasattr(cls, _FIELDS)
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001031
1032
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001033def asdict(obj, *, dict_factory=dict):
1034 """Return the fields of a dataclass instance as a new dictionary mapping
1035 field names to field values.
1036
1037 Example usage:
1038
1039 @dataclass
1040 class C:
1041 x: int
1042 y: int
1043
1044 c = C(1, 2)
1045 assert asdict(c) == {'x': 1, 'y': 2}
1046
1047 If given, 'dict_factory' will be used instead of built-in dict.
1048 The function applies recursively to field values that are
1049 dataclass instances. This will also look into built-in containers:
1050 tuples, lists, and dicts.
1051 """
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001052 if not _is_dataclass_instance(obj):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001053 raise TypeError("asdict() should be called on dataclass instances")
1054 return _asdict_inner(obj, dict_factory)
1055
Eric V. Smithdbf9cff2018-02-25 21:30:17 -05001056
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001057def _asdict_inner(obj, dict_factory):
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001058 if _is_dataclass_instance(obj):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001059 result = []
1060 for f in fields(obj):
1061 value = _asdict_inner(getattr(obj, f.name), dict_factory)
1062 result.append((f.name, value))
1063 return dict_factory(result)
Eric V. Smith9b9d97d2018-09-14 11:32:16 -04001064 elif isinstance(obj, tuple) and hasattr(obj, '_fields'):
1065 # obj is a namedtuple. Recurse into it, but the returned
1066 # object is another namedtuple of the same type. This is
1067 # similar to how other list- or tuple-derived classes are
1068 # treated (see below), but we just need to create them
1069 # differently because a namedtuple's __init__ needs to be
1070 # called differently (see bpo-34363).
1071
1072 # I'm not using namedtuple's _asdict()
1073 # method, because:
1074 # - it does not recurse in to the namedtuple fields and
1075 # convert them to dicts (using dict_factory).
1076 # - I don't actually want to return a dict here. The the main
1077 # use case here is json.dumps, and it handles converting
1078 # namedtuples to lists. Admittedly we're losing some
1079 # information here when we produce a json list instead of a
1080 # dict. Note that if we returned dicts here instead of
1081 # namedtuples, we could no longer call asdict() on a data
1082 # structure where a namedtuple was used as a dict key.
1083
1084 return type(obj)(*[_asdict_inner(v, dict_factory) for v in obj])
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001085 elif isinstance(obj, (list, tuple)):
Eric V. Smith9b9d97d2018-09-14 11:32:16 -04001086 # Assume we can create an object of this type by passing in a
1087 # generator (which is not true for namedtuples, handled
1088 # above).
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001089 return type(obj)(_asdict_inner(v, dict_factory) for v in obj)
1090 elif isinstance(obj, dict):
Eric V. Smith9b9d97d2018-09-14 11:32:16 -04001091 return type(obj)((_asdict_inner(k, dict_factory),
1092 _asdict_inner(v, dict_factory))
1093 for k, v in obj.items())
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001094 else:
Eric V. Smithf96ddad2018-03-24 17:20:26 -04001095 return copy.deepcopy(obj)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001096
1097
1098def astuple(obj, *, tuple_factory=tuple):
1099 """Return the fields of a dataclass instance as a new tuple of field values.
1100
1101 Example usage::
1102
1103 @dataclass
1104 class C:
1105 x: int
1106 y: int
1107
1108 c = C(1, 2)
Raymond Hettingerd55209d2018-01-10 20:56:41 -08001109 assert astuple(c) == (1, 2)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001110
1111 If given, 'tuple_factory' will be used instead of built-in tuple.
1112 The function applies recursively to field values that are
1113 dataclass instances. This will also look into built-in containers:
1114 tuples, lists, and dicts.
1115 """
1116
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001117 if not _is_dataclass_instance(obj):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001118 raise TypeError("astuple() should be called on dataclass instances")
1119 return _astuple_inner(obj, tuple_factory)
1120
Eric V. Smithdbf9cff2018-02-25 21:30:17 -05001121
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001122def _astuple_inner(obj, tuple_factory):
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001123 if _is_dataclass_instance(obj):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001124 result = []
1125 for f in fields(obj):
1126 value = _astuple_inner(getattr(obj, f.name), tuple_factory)
1127 result.append(value)
1128 return tuple_factory(result)
Eric V. Smith9b9d97d2018-09-14 11:32:16 -04001129 elif isinstance(obj, tuple) and hasattr(obj, '_fields'):
1130 # obj is a namedtuple. Recurse into it, but the returned
1131 # object is another namedtuple of the same type. This is
1132 # similar to how other list- or tuple-derived classes are
1133 # treated (see below), but we just need to create them
1134 # differently because a namedtuple's __init__ needs to be
1135 # called differently (see bpo-34363).
1136 return type(obj)(*[_astuple_inner(v, tuple_factory) for v in obj])
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001137 elif isinstance(obj, (list, tuple)):
Eric V. Smith9b9d97d2018-09-14 11:32:16 -04001138 # Assume we can create an object of this type by passing in a
1139 # generator (which is not true for namedtuples, handled
1140 # above).
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001141 return type(obj)(_astuple_inner(v, tuple_factory) for v in obj)
1142 elif isinstance(obj, dict):
1143 return type(obj)((_astuple_inner(k, tuple_factory), _astuple_inner(v, tuple_factory))
1144 for k, v in obj.items())
1145 else:
Eric V. Smithf96ddad2018-03-24 17:20:26 -04001146 return copy.deepcopy(obj)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001147
1148
Eric V. Smithd80b4432018-01-06 17:09:58 -05001149def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True,
Eric V. Smith5da8cfb2018-03-01 08:01:41 -05001150 repr=True, eq=True, order=False, unsafe_hash=False,
Eric V. Smithdbf9cff2018-02-25 21:30:17 -05001151 frozen=False):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001152 """Return a new dynamically created dataclass.
1153
Eric V. Smithed7d4292018-01-06 16:14:03 -05001154 The dataclass name will be 'cls_name'. 'fields' is an iterable
1155 of either (name), (name, type) or (name, type, Field) objects. If type is
1156 omitted, use the string 'typing.Any'. Field objects are created by
Eric V. Smithd327ae62018-01-07 08:19:45 -05001157 the equivalent of calling 'field(name, type [, Field-info])'.
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001158
Raymond Hettingerd55209d2018-01-10 20:56:41 -08001159 C = make_dataclass('C', ['x', ('y', int), ('z', int, field(init=False))], bases=(Base,))
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001160
1161 is equivalent to:
1162
1163 @dataclass
1164 class C(Base):
Raymond Hettingerd55209d2018-01-10 20:56:41 -08001165 x: 'typing.Any'
1166 y: int
1167 z: int = field(init=False)
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001168
Raymond Hettingerd55209d2018-01-10 20:56:41 -08001169 For the bases and namespace parameters, see the builtin type() function.
Eric V. Smithd80b4432018-01-06 17:09:58 -05001170
Eric V. Smithdbf9cff2018-02-25 21:30:17 -05001171 The parameters init, repr, eq, order, unsafe_hash, and frozen are passed to
Eric V. Smithd80b4432018-01-06 17:09:58 -05001172 dataclass().
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001173 """
1174
1175 if namespace is None:
1176 namespace = {}
1177 else:
1178 # Copy namespace since we're going to mutate it.
1179 namespace = namespace.copy()
1180
Eric V. Smith4e812962018-05-16 11:31:29 -04001181 # While we're looking through the field names, validate that they
1182 # are identifiers, are not keywords, and not duplicates.
1183 seen = set()
Eric V. Smithd1388922018-01-07 14:30:17 -05001184 anns = {}
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001185 for item in fields:
Eric V. Smithed7d4292018-01-06 16:14:03 -05001186 if isinstance(item, str):
1187 name = item
1188 tp = 'typing.Any'
1189 elif len(item) == 2:
1190 name, tp, = item
1191 elif len(item) == 3:
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001192 name, tp, spec = item
1193 namespace[name] = spec
Eric V. Smith4e812962018-05-16 11:31:29 -04001194 else:
1195 raise TypeError(f'Invalid field: {item!r}')
1196
1197 if not isinstance(name, str) or not name.isidentifier():
Kyle Stanley24b5b362019-07-21 22:48:45 -04001198 raise TypeError(f'Field names must be valid identifiers: {name!r}')
Eric V. Smith4e812962018-05-16 11:31:29 -04001199 if keyword.iskeyword(name):
1200 raise TypeError(f'Field names must not be keywords: {name!r}')
1201 if name in seen:
1202 raise TypeError(f'Field name duplicated: {name!r}')
1203
1204 seen.add(name)
Eric V. Smithed7d4292018-01-06 16:14:03 -05001205 anns[name] = tp
1206
1207 namespace['__annotations__'] = anns
Ivan Levkivskyi5a7092d2018-03-31 13:41:17 +01001208 # We use `types.new_class()` instead of simply `type()` to allow dynamic creation
1209 # of generic dataclassses.
1210 cls = types.new_class(cls_name, bases, {}, lambda ns: ns.update(namespace))
Eric V. Smithd80b4432018-01-06 17:09:58 -05001211 return dataclass(cls, init=init, repr=repr, eq=eq, order=order,
Eric V. Smithdbf9cff2018-02-25 21:30:17 -05001212 unsafe_hash=unsafe_hash, frozen=frozen)
1213
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001214
Serhiy Storchakaf5b89af2019-06-19 10:33:27 +03001215def replace(*args, **changes):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001216 """Return a new object replacing specified fields with new values.
1217
1218 This is especially useful for frozen classes. Example usage:
1219
1220 @dataclass(frozen=True)
1221 class C:
1222 x: int
1223 y: int
1224
1225 c = C(1, 2)
1226 c1 = replace(c, x=3)
1227 assert c1.x == 3 and c1.y == 2
1228 """
Serhiy Storchakaf5b89af2019-06-19 10:33:27 +03001229 if len(args) > 1:
1230 raise TypeError(f'replace() takes 1 positional argument but {len(args)} were given')
1231 if args:
1232 obj, = args
1233 elif 'obj' in changes:
1234 obj = changes.pop('obj')
1235 import warnings
1236 warnings.warn("Passing 'obj' as keyword argument is deprecated",
1237 DeprecationWarning, stacklevel=2)
1238 else:
1239 raise TypeError("replace() missing 1 required positional argument: 'obj'")
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001240
Eric V. Smithf8e75492018-05-16 05:14:53 -04001241 # We're going to mutate 'changes', but that's okay because it's a
1242 # new dict, even if called with 'replace(obj, **my_changes)'.
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001243
Eric V. Smithe7ba0132018-01-06 12:41:53 -05001244 if not _is_dataclass_instance(obj):
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001245 raise TypeError("replace() should be called on dataclass instances")
1246
1247 # It's an error to have init=False fields in 'changes'.
1248 # If a field is not in 'changes', read its value from the provided obj.
1249
Eric V. Smithf199bc62018-03-18 20:40:34 -04001250 for f in getattr(obj, _FIELDS).values():
Eric V. Smithe7adf2b2018-06-07 14:43:59 -04001251 # Only consider normal fields or InitVars.
1252 if f._field_type is _FIELD_CLASSVAR:
1253 continue
1254
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001255 if not f.init:
1256 # Error if this field is specified in changes.
1257 if f.name in changes:
1258 raise ValueError(f'field {f.name} is declared with '
1259 'init=False, it cannot be specified with '
1260 'replace()')
1261 continue
1262
1263 if f.name not in changes:
Dong-hee Na3d70f7a2018-06-23 23:46:32 +09001264 if f._field_type is _FIELD_INITVAR:
1265 raise ValueError(f"InitVar {f.name!r} "
1266 'must be specified with replace()')
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001267 changes[f.name] = getattr(obj, f.name)
1268
Eric V. Smithf96ddad2018-03-24 17:20:26 -04001269 # Create the new object, which calls __init__() and
Eric V. Smithf8e75492018-05-16 05:14:53 -04001270 # __post_init__() (if defined), using all of the init fields we've
1271 # added and/or left in 'changes'. If there are values supplied in
1272 # changes that aren't fields, this will correctly raise a
1273 # TypeError.
Eric V. Smithf0db54a2017-12-04 16:58:55 -05001274 return obj.__class__(**changes)
Serhiy Storchakaf5b89af2019-06-19 10:33:27 +03001275replace.__text_signature__ = '(obj, /, **kwargs)'