From 275b6f88f3a5158228c15ec39a79901bc4973c79 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Wed, 20 Feb 2019 11:41:41 +0000 Subject: [PATCH 1/3] Fix missing builtin aliases on Python 2 --- mypy/newsemanal/semanal.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mypy/newsemanal/semanal.py b/mypy/newsemanal/semanal.py index 233fdc4247e4..183255511923 100644 --- a/mypy/newsemanal/semanal.py +++ b/mypy/newsemanal/semanal.py @@ -3823,7 +3823,11 @@ def add_builtin_aliases(self, tree: MypyFile) -> None: self.mark_incomplete(name, tree) else: # Test fixtures may be missing some builtin classes, which is okay. - pass + # Also some targets are not available on Python 2, like collections.ChainMap. + # Kill the placeholder if there is one. + if name in tree.names: + assert isinstance(tree.names[name].node, PlaceholderNode) + del tree.names[name] def lookup_fully_qualified(self, name: str) -> SymbolTableNode: """Lookup a fully qualified name. From 100de63a876b5da493cb8df666a2f681f6f01acc Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Thu, 21 Feb 2019 21:30:29 +0000 Subject: [PATCH 2/3] Address CR --- mypy/newsemanal/semanal.py | 6 ++++-- mypy/nodes.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/mypy/newsemanal/semanal.py b/mypy/newsemanal/semanal.py index ea1ba6252b71..648686ed7e84 100644 --- a/mypy/newsemanal/semanal.py +++ b/mypy/newsemanal/semanal.py @@ -71,7 +71,7 @@ IntExpr, FloatExpr, UnicodeExpr, TempNode, OverloadPart, PlaceholderNode, COVARIANT, CONTRAVARIANT, INVARIANT, nongen_builtins, get_member_expr_fullname, REVEAL_TYPE, - REVEAL_LOCALS, is_final_node, TypedDictExpr + REVEAL_LOCALS, is_final_node, TypedDictExpr, type_aliases_target_versions ) from mypy.tvar_scope import TypeVarScope from mypy.typevars import fill_typevars @@ -3840,6 +3840,9 @@ def add_builtin_aliases(self, tree: MypyFile) -> None: """ assert tree.fullname() == 'typing' for alias, target_name in type_aliases.items(): + if type_aliases_target_versions[alias] < self.options.python_version: + # This alias is not available on this Python version. + continue name = alias.split('.')[-1] if name in tree.names and not isinstance(tree.names[name].node, PlaceholderNode): continue @@ -3863,7 +3866,6 @@ def add_builtin_aliases(self, tree: MypyFile) -> None: self.mark_incomplete(name, tree) else: # Test fixtures may be missing some builtin classes, which is okay. - # Also some targets are not available on Python 2, like collections.ChainMap. # Kill the placeholder if there is one. if name in tree.names: assert isinstance(tree.names[name].node, PlaceholderNode) diff --git a/mypy/nodes.py b/mypy/nodes.py index b1ae7e59f523..33cbda418115 100644 --- a/mypy/nodes.py +++ b/mypy/nodes.py @@ -111,6 +111,19 @@ def get_column(self) -> int: 'typing.Deque': 'collections.deque', } # type: Final +# This keeps track of the oldest supported Python version where the corresponding +# alias _target_ is available. +type_aliases_target_versions = { + 'typing.List': (2, 7), + 'typing.Dict': (2, 7), + 'typing.Set': (2, 7), + 'typing.FrozenSet': (2, 7), + 'typing.ChainMap': (3, 3), + 'typing.Counter': (2, 7), + 'typing.DefaultDict': (2, 7), + 'typing.Deque': (2, 7), +} # type: Final + reverse_builtin_aliases = { 'builtins.list': 'typing.List', 'builtins.dict': 'typing.Dict', From 5e3c8cbf04550d1017905ed0f2ed50f76a2a8ec4 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Thu, 21 Feb 2019 21:34:14 +0000 Subject: [PATCH 3/3] Fix the comparison sign --- mypy/newsemanal/semanal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy/newsemanal/semanal.py b/mypy/newsemanal/semanal.py index 648686ed7e84..947fb921e23b 100644 --- a/mypy/newsemanal/semanal.py +++ b/mypy/newsemanal/semanal.py @@ -3840,7 +3840,7 @@ def add_builtin_aliases(self, tree: MypyFile) -> None: """ assert tree.fullname() == 'typing' for alias, target_name in type_aliases.items(): - if type_aliases_target_versions[alias] < self.options.python_version: + if type_aliases_target_versions[alias] > self.options.python_version: # This alias is not available on this Python version. continue name = alias.split('.')[-1]