mirror of
https://github.com/python/cpython.git
synced 2025-08-23 02:04:56 +00:00
bpo-41515: Fix KeyError raised in get_type_hints (GH-25352)
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Co-authored-by: efahl <36704995+efahl@users.noreply.github.com>
This commit is contained in:
parent
852150ddfe
commit
a9cf69df2e
3 changed files with 12 additions and 1 deletions
|
@ -2267,6 +2267,12 @@ class ClassVarTests(BaseTestCase):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
issubclass(int, ClassVar)
|
issubclass(int, ClassVar)
|
||||||
|
|
||||||
|
def test_bad_module(self):
|
||||||
|
# bpo-41515
|
||||||
|
class BadModule:
|
||||||
|
pass
|
||||||
|
BadModule.__module__ = 'bad' # Something not in sys.modules
|
||||||
|
assert(get_type_hints(BadModule), {})
|
||||||
|
|
||||||
class FinalTests(BaseTestCase):
|
class FinalTests(BaseTestCase):
|
||||||
|
|
||||||
|
|
|
@ -1628,7 +1628,10 @@ def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
|
||||||
hints = {}
|
hints = {}
|
||||||
for base in reversed(obj.__mro__):
|
for base in reversed(obj.__mro__):
|
||||||
if globalns is None:
|
if globalns is None:
|
||||||
|
try:
|
||||||
base_globals = sys.modules[base.__module__].__dict__
|
base_globals = sys.modules[base.__module__].__dict__
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
else:
|
else:
|
||||||
base_globals = globalns
|
base_globals = globalns
|
||||||
ann = base.__dict__.get('__annotations__', {})
|
ann = base.__dict__.get('__annotations__', {})
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix :exc:`KeyError` raised in :func:`typing.get_type_hints` due to
|
||||||
|
synthetic modules that don't appear in ``sys.modules``.
|
Loading…
Add table
Add a link
Reference in a new issue