@@ -645,6 +645,7 @@ class _ClassBuilder:
645645 "_is_exc" ,
646646 "_on_setattr" ,
647647 "_pre_init_has_args" ,
648+ "_resolve_types" ,
648649 "_slots" ,
649650 "_weakref_slot" ,
650651 "_wrote_own_setattr" ,
@@ -666,6 +667,7 @@ def __init__(
666667 on_setattr ,
667668 has_custom_setattr ,
668669 field_transformer ,
670+ resolve_types ,
669671 ):
670672 attrs , base_attrs , base_map = _transform_attrs (
671673 cls ,
@@ -683,6 +685,7 @@ def __init__(
683685 self ._base_attr_map = base_map
684686 self ._attr_names = tuple (a .name for a in attrs )
685687 self ._slots = slots
688+ self ._resolve_types = resolve_types
686689 self ._frozen = frozen
687690 self ._weakref_slot = weakref_slot
688691 self ._cache_hash = cache_hash
@@ -766,6 +769,12 @@ def build_class(self):
766769 ):
767770 cls .__attrs_init_subclass__ ()
768771
772+ if self ._resolve_types :
773+ # Need to import here to avoid circular imports
774+ from . import _funcs
775+
776+ cls = _funcs .resolve_types (cls )
777+
769778 return cls
770779
771780 def _patch_original_class (self ):
@@ -1267,6 +1276,7 @@ def attrs(
12671276 field_transformer = None ,
12681277 match_args = True ,
12691278 unsafe_hash = None ,
1279+ resolve_types = False ,
12701280):
12711281 r"""
12721282 A class decorator that adds :term:`dunder methods` according to the
@@ -1333,6 +1343,8 @@ def attrs(
13331343 If a class has an *inherited* classmethod called
13341344 ``__attrs_init_subclass__``, it is executed after the class is created.
13351345 .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*.
1346+ .. versionadded:: 25.1.0
1347+ Added the *resolve_types* argument.
13361348 """
13371349 if repr_ns is not None :
13381350 import warnings
@@ -1385,6 +1397,7 @@ def wrap(cls):
13851397 on_setattr ,
13861398 has_own_setattr ,
13871399 field_transformer ,
1400+ resolve_types ,
13881401 )
13891402 if _determine_whether_to_implement (
13901403 cls , repr , auto_detect , ("__repr__" ,)
0 commit comments