Further deduplicate implementation of special forms (#229)
diff --git a/src/typing_extensions.py b/src/typing_extensions.py
index 1f28e54..9e33402 100644
--- a/src/typing_extensions.py
+++ b/src/typing_extensions.py
@@ -201,17 +201,19 @@
ClassVar = typing.ClassVar
+
+class _ExtensionsSpecialForm(typing._SpecialForm, _root=True):
+ def __repr__(self):
+ return 'typing_extensions.' + self._name
+
+
# On older versions of typing there is an internal class named "Final".
# 3.8+
if hasattr(typing, 'Final') and sys.version_info[:2] >= (3, 7):
Final = typing.Final
# 3.7
else:
- class _FinalForm(typing._SpecialForm, _root=True):
-
- def __repr__(self):
- return 'typing_extensions.' + self._name
-
+ class _FinalForm(_ExtensionsSpecialForm, _root=True):
def __getitem__(self, parameters):
item = typing._type_check(parameters,
f'{self._name} accepts only a single type.')
@@ -303,14 +305,11 @@
def __hash__(self):
return hash(frozenset(_value_and_type_iter(self.__args__)))
- class _LiteralForm(typing._SpecialForm, _root=True):
+ class _LiteralForm(_ExtensionsSpecialForm, _root=True):
def __init__(self, doc: str):
self._name = 'Literal'
self._doc = self.__doc__ = doc
- def __repr__(self):
- return 'typing_extensions.' + self._name
-
def __getitem__(self, parameters):
if not isinstance(parameters, tuple):
parameters = (parameters,)
@@ -1374,11 +1373,6 @@
return ()
-class _ExtensionsSpecialForm(typing._SpecialForm, _root=True):
- def __repr__(self):
- return 'typing_extensions.' + self._name
-
-
# 3.10+
if hasattr(typing, 'TypeAlias'):
TypeAlias = typing.TypeAlias