Blob Blame History Raw
diff --git a/typing_inspect.py b/typing_inspect.py
index 2444027..eee2ed3 100644
--- a/typing_inspect.py
+++ b/typing_inspect.py
@@ -16,6 +16,7 @@ if NEW_TYPING:
 
 WITH_LITERAL = True
 WITH_CLASSVAR = True
+WITH_TYPING_3_9 = True
 LEGACY_TYPING = False
 
 if NEW_TYPING:
@@ -23,6 +24,12 @@ if NEW_TYPING:
         Generic, Callable, Union, TypeVar, ClassVar, Tuple, _GenericAlias, ForwardRef
     )
     from typing_extensions import Literal
+
+    try:  # python 3.9
+        from typing import _SpecialGenericAlias
+    except ImportErrror:
+        WITH_TYPING_3_9 = False
+
 else:
     from typing import (
         Callable, CallableMeta, Union, Tuple, TupleMeta, TypeVar, GenericMeta, _ForwardRef
@@ -43,7 +50,6 @@ else:
         except ImportError:
             WITH_LITERAL = False
 
-
 def _gorg(cls):
     """This function exists for compatibility with old typing versions."""
     assert isinstance(cls, GenericMeta)
@@ -72,6 +78,10 @@ def is_generic_type(tp):
         is_generic_type(MutableMapping[T, List[int]]) == True
         is_generic_type(Sequence[Union[str, bytes]]) == True
     """
+    if WITH_TYPING_3_9:
+        return (isinstance(tp, type) and issubclass(tp, Generic) or
+            ((isinstance(tp, _GenericAlias) or isinstance(tp, _SpecialGenericAlias)) and
+            tp.__origin__ not in (Union, tuple, ClassVar, collections.abc.Callable)))
     if NEW_TYPING:
         return (isinstance(tp, type) and issubclass(tp, Generic) or
                 isinstance(tp, _GenericAlias) and