@@ -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.
12021203def _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
12061207def _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
14011395def _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