diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-07-20 08:24:57 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-20 17:24:57 +0200 |
| commit | c2f33dfc83ab270412bf243fb21f724037effa1a (patch) | |
| tree | d08471a57400ca0aa61a1bf3468e5cb1fed1e609 /Lib/typing.py | |
| parent | c895f2bc4f270efce30fe3687ce85095418175f4 (diff) | |
| download | cpython-git-c2f33dfc83ab270412bf243fb21f724037effa1a.tar.gz | |
bpo-44353: Refactor typing.NewType into callable class (GH-27250) (#27258)
(cherry picked from commit 965dd76e9060e27e2253ba8c8d21a142b178720d)
Co-authored-by: Yurii Karabas <1998uriyyo@gmail.com>
Diffstat (limited to 'Lib/typing.py')
| -rw-r--r-- | Lib/typing.py | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index cb70394bec..1606de91ac 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1373,6 +1373,12 @@ def _no_init(self, *args, **kwargs): if type(self)._is_protocol: raise TypeError('Protocols cannot be instantiated') +def _callee(depth=2, default=None): + try: + return sys._getframe(depth).f_globals['__name__'] + except (AttributeError, ValueError): # For platforms without _getframe() + return default + def _allow_reckless_class_checks(depth=3): """Allow instance and class checks for special stdlib modules. @@ -2349,7 +2355,7 @@ _TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) TypedDict.__mro_entries__ = lambda bases: (_TypedDict,) -def NewType(name, tp): +class NewType: """NewType creates simple unique types with almost zero runtime overhead. NewType(name, tp) is considered a subtype of tp by static type checkers. At runtime, NewType(name, tp) returns @@ -2368,12 +2374,23 @@ def NewType(name, tp): num = UserId(5) + 1 # type: int """ - def new_type(x): + def __init__(self, name, tp): + self.__name__ = name + self.__qualname__ = name + self.__module__ = _callee(default='typing') + self.__supertype__ = tp + + def __repr__(self): + return f'{self.__module__}.{self.__qualname__}' + + def __call__(self, x): return x - new_type.__name__ = name - new_type.__supertype__ = tp - return new_type + def __or__(self, other): + return Union[self, other] + + def __ror__(self, other): + return Union[other, self] # Python-version-specific alias (Python 2: unicode; Python 3: str) |
