diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index c566b0aa..a2ad747a 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -654,6 +654,7 @@ def py__iter__types(evaluator, types, node=None): def py__getitem__(evaluator, context, types, trailer): from jedi.evaluate.representation import ClassContext + from jedi.evaluate.instance import TreeInstance result = set() trailer_op, node, trailer_cl = trailer.children @@ -663,7 +664,7 @@ def py__getitem__(evaluator, context, types, trailer): # special case: PEP0484 typing module, see # https://github.com/davidhalter/jedi/issues/663 for typ in list(types): - if isinstance(typ, ClassContext): + if isinstance(typ, (ClassContext, TreeInstance)): typing_module_types = pep0484.py__getitem__(context, typ, node) if typing_module_types is not None: types.remove(typ) diff --git a/jedi/evaluate/pep0484.py b/jedi/evaluate/pep0484.py index 28b344eb..d066e549 100644 --- a/jedi/evaluate/pep0484.py +++ b/jedi/evaluate/pep0484.py @@ -139,9 +139,13 @@ def py__getitem__(context, typ, node): type_name = typ.name.string_name # hacked in Union and Optional, since it's hard to do nicely in parsed code - if type_name == "Union": + if type_name in ("Union", '_Union'): + # In Python 3.6 it's still called typing.Union but it's an instance + # called _Union. return unite(context.eval_node(node) for node in nodes) - if type_name == "Optional": + if type_name in ("Optional", '_Optional'): + # Here we have the same issue like in Union. Therefore we also need to + # check for the instance typing._Optional (Python 3.6). return context.eval_node(nodes[0]) from jedi.evaluate.representation import ModuleContext