@@ -811,21 +811,33 @@ def _is_type(annotation, cls, a_module, a_type, is_type_predicate):
811811 _MODULE_IDENTIFIER_RE = re .compile (r'(?:\s*(\w+)\s*\.)?\s*(\w+)' )
812812
813813 match = _MODULE_IDENTIFIER_RE .prefixmatch (annotation )
814- if match :
815- ns = None
816- module_name = match [1 ]
817- if not module_name :
818- # No module name, assume the class's module did
819- # "from dataclasses import InitVar".
820- ns = sys .modules .get (cls .__module__ ).__dict__
821- else :
822- # Look up module_name in the class's module.
823- module = sys .modules .get (cls .__module__ )
824- if module and module .__dict__ .get (module_name ) is a_module :
825- ns = sys .modules .get (a_type .__module__ ).__dict__
826- if ns and is_type_predicate (ns .get (match [2 ]), a_module ):
827- return True
828- return False
814+ if not match :
815+ return False
816+
817+ ns = None
818+ module_name = match .group (1 )
819+ type_name = match .group (2 )
820+
821+ if not module_name :
822+ # No module name, assume the class's module did
823+ # "from dataclasses import InitVar".
824+ ns = sys .modules .get (cls .__module__ ).__dict__
825+ else :
826+ # Look up module_name in the class's module.
827+ cls_module = sys .modules .get (cls .__module__ )
828+ if not cls_module :
829+ return False
830+
831+ a_type_module = cls_module .__dict__ .get (module_name )
832+ if (
833+ isinstance (a_type_module , types .ModuleType )
834+ # Consider the case when a_type does not belong
835+ # to the namespace, e.g. 'dataclasses.ClassVar[int]'
836+ and a_type_module .__dict__ .get (type_name ) is a_type
837+ ):
838+ ns = sys .modules .get (a_type .__module__ ).__dict__
839+
840+ return ns and is_type_predicate (ns .get (type_name ), a_module )
829841
830842
831843def _get_field (cls , a_name , a_type , default_kw_only ):
0 commit comments