diff options
author | Yurii Karabas <1998uriyyo@gmail.com> | 2021-07-30 13:49:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-30 13:49:24 (GMT) |
commit | ea4673ed0757e9bfe8774e60cfae3313e9927b5f (patch) | |
tree | 2bb47a1ea6b8f4331ecbbe3dbc19df92969d9ed1 /Lib/typing.py | |
parent | 7b975f81e4dba70a42c6279539a7fcfe4211b4c0 (diff) | |
download | cpython-ea4673ed0757e9bfe8774e60cfae3313e9927b5f.zip cpython-ea4673ed0757e9bfe8774e60cfae3313e9927b5f.tar.gz cpython-ea4673ed0757e9bfe8774e60cfae3313e9927b5f.tar.bz2 |
bpo-44747: Refactor usage of sys._getframe at typing module (#27387)
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Diffstat (limited to 'Lib/typing.py')
-rw-r--r-- | Lib/typing.py | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index 2826525..702bb64 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -798,10 +798,7 @@ class TypeVar( _Final, _Immutable, _TypeVarLike, _root=True): raise TypeError("A single constraint is not allowed") msg = "TypeVar(name, constraint, ...): constraints must be types." self.__constraints__ = tuple(_type_check(t, msg) for t in constraints) - try: - def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') # for pickling - except (AttributeError, ValueError): - def_mod = None + def_mod = _caller() if def_mod != 'typing': self.__module__ = def_mod @@ -904,10 +901,7 @@ class ParamSpec(_Final, _Immutable, _TypeVarLike, _root=True): def __init__(self, name, *, bound=None, covariant=False, contravariant=False): self.__name__ = name super().__init__(bound, covariant, contravariant) - try: - def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - def_mod = None + def_mod = _caller() if def_mod != 'typing': self.__module__ = def_mod @@ -1400,10 +1394,7 @@ def _allow_reckless_class_checks(depth=3): The abc and functools modules indiscriminately call isinstance() and issubclass() on the whole MRO of a user class, which may contain protocols. """ - try: - return sys._getframe(depth).f_globals['__name__'] in ['abc', 'functools'] - except (AttributeError, ValueError): # For platforms without _getframe(). - return True + return _caller(depth) in {'abc', 'functools', None} _PROTO_ALLOWLIST = { @@ -2238,11 +2229,7 @@ def NamedTuple(typename, fields=None, /, **kwargs): elif kwargs: raise TypeError("Either list of fields or keywords" " can be provided to NamedTuple, not both") - try: - module = sys._getframe(1).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - module = None - return _make_nmtuple(typename, fields, module=module) + return _make_nmtuple(typename, fields, module=_caller()) _NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {}) @@ -2357,11 +2344,10 @@ def TypedDict(typename, fields=None, /, *, total=True, **kwargs): " but not both") ns = {'__annotations__': dict(fields)} - try: + module = _caller() + if module is not None: # Setting correct module is necessary to make typed dict classes pickleable. - ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - pass + ns['__module__'] = module return _TypedDictMeta(typename, (), ns, total=total) |