@@ -753,21 +753,33 @@ def _is_type(annotation, cls, a_module, a_type, is_type_predicate):
753753 # that's defined. It was judged not worth it.
754754
755755 match = _MODULE_IDENTIFIER_RE .match (annotation )
756- if match :
757- ns = None
758- module_name = match .group (1 )
759- if not module_name :
760- # No module name, assume the class's module did
761- # "from dataclasses import InitVar".
762- ns = sys .modules .get (cls .__module__ ).__dict__
763- else :
764- # Look up module_name in the class's module.
765- module = sys .modules .get (cls .__module__ )
766- if module and module .__dict__ .get (module_name ) is a_module :
767- ns = sys .modules .get (a_type .__module__ ).__dict__
768- if ns and is_type_predicate (ns .get (match .group (2 )), a_module ):
769- return True
770- return False
756+ if not match :
757+ return False
758+
759+ ns = None
760+ module_name = match .group (1 )
761+ type_name = match .group (2 )
762+
763+ if not module_name :
764+ # No module name, assume the class's module did
765+ # "from dataclasses import InitVar".
766+ ns = sys .modules .get (cls .__module__ ).__dict__
767+ else :
768+ # Look up module_name in the class's module.
769+ cls_module = sys .modules .get (cls .__module__ )
770+ if not cls_module :
771+ return False
772+
773+ a_type_module = cls_module .__dict__ .get (module_name )
774+ if (
775+ isinstance (a_type_module , types .ModuleType )
776+ # Consider the case when a_type does not belong
777+ # to the namespace, e.g. 'dataclasses.ClassVar[int]'
778+ and a_type_module .__dict__ .get (type_name ) is a_type
779+ ):
780+ ns = sys .modules .get (a_type .__module__ ).__dict__
781+
782+ return ns and is_type_predicate (ns .get (type_name ), a_module )
771783
772784
773785def _get_field (cls , a_name , a_type , default_kw_only ):
0 commit comments