Skip to content

Commit 5c8892b

Browse files
committed
inline _field_names
1 parent 573b186 commit 5c8892b

1 file changed

Lines changed: 7 additions & 13 deletions

File tree

Lib/dataclasses.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen,
10541054
# Remember all of the fields on our class (including bases). This
10551055
# also marks this class as being a dataclass.
10561056
setattr(cls, _FIELDS, fields)
1057+
# Store field names. Excludes pseudo-fields.
10571058
setattr(cls, _FIELD_NAMES, tuple(f.name for f in fields.values()
10581059
if f._field_type is _FIELD))
10591060

@@ -1200,11 +1201,11 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen,
12001201
# the code instead of iterating over fields. But that can be a project for
12011202
# another day, if performance becomes an issue.
12021203
def _dataclass_getstate(self):
1203-
return [getattr(self, name) for name in _field_names(self)]
1204+
return [getattr(self, name) for name in self.__dataclass_field_names__]
12041205

12051206

12061207
def _dataclass_setstate(self, state):
1207-
for field_name, value in zip(_field_names(self), state):
1208+
for field_name, value in zip(self.__dataclass_field_names__, state):
12081209
# use setattr because dataclass may be frozen
12091210
object.__setattr__(self, field_name, value)
12101211

@@ -1289,7 +1290,7 @@ def _add_slots(cls, is_frozen, weakref_slot, defined_fields):
12891290

12901291
# Create a new dict for our new class.
12911292
cls_dict = dict(cls.__dict__)
1292-
field_names = _field_names(cls)
1293+
field_names = cls.__dataclass_field_names__
12931294
# Make sure slots don't overlap with those in base classes.
12941295
inherited_slots = set(
12951296
itertools.chain.from_iterable(map(_get_slots, cls.__mro__[1:-1]))
@@ -1390,13 +1391,6 @@ def fields(class_or_instance):
13901391
# order, so the order of the tuple is as the fields were defined.
13911392
return tuple(f for f in fields.values() if f._field_type is _FIELD)
13921393

1393-
def _field_names(class_or_instance):
1394-
"""Return a tuple describing the field names of this dataclass.
1395-
1396-
Accepts a dataclass or an instance of one. Excludes pseudo-fields.
1397-
"""
1398-
return getattr(class_or_instance, _FIELD_NAMES)
1399-
14001394

14011395
def _is_dataclass_instance(obj):
14021396
"""Returns True if obj is an instance of a dataclass."""
@@ -1443,12 +1437,12 @@ def _asdict_inner(obj, dict_factory):
14431437
if dict_factory is dict:
14441438
return {
14451439
name: _asdict_inner(getattr(obj, name), dict)
1446-
for name in _field_names(obj_type)
1440+
for name in obj_type.__dataclass_field_names__
14471441
}
14481442
else:
14491443
return dict_factory([
14501444
(name, _asdict_inner(getattr(obj, name), dict_factory))
1451-
for name in _field_names(obj_type)
1445+
for name in obj_type.__dataclass_field_names__
14521446
])
14531447
# handle the builtin types first for speed; subclasses handled below
14541448
elif obj_type is list:
@@ -1532,7 +1526,7 @@ def _astuple_inner(obj, tuple_factory):
15321526
elif _is_dataclass_instance(obj):
15331527
return tuple_factory([
15341528
_astuple_inner(getattr(obj, name), tuple_factory)
1535-
for name in _field_names(obj)
1529+
for name in obj.__dataclass_field_names__
15361530
])
15371531
elif isinstance(obj, tuple) and hasattr(obj, '_fields'):
15381532
# obj is a namedtuple. Recurse into it, but the returned

0 commit comments

Comments
 (0)