Skip to content

Commit

Permalink
Add fix for python/mypy#9980
Browse files Browse the repository at this point in the history
  • Loading branch information
huwcbjones committed Nov 10, 2021
1 parent 12c85db commit 418a8c4
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 0 deletions.
6 changes: 6 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
mypy (0.910-3pexip3) pexip; urgency=medium

* Fix for https://github.com/python/mypy/issues/9980

-- Huw Jones <huw@pexip.com> Wed, 10 Nov 2021 16:49:48 +0000

mypy (0.910-3pexip2) pexip; urgency=medium

* Pin runtime deps
Expand Down
119 changes: 119 additions & 0 deletions debian/patches/issue-9980.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
From 6eafc5e3487866001d0447514e67d3861c13bb7b Mon Sep 17 00:00:00 2001
From: Jukka Lehtosalo <jukka.lehtosalo@iki.fi>
Date: Mon, 5 Jul 2021 14:52:15 +0100
Subject: [PATCH] Fixes to generic builtin types (#10766)

This fixes these issues:

* Allow variable-length tuple (tuple[int, ...]) in type aliases
* Allow generic built-in types (e.g. list[int]) in stubs in all Python versions

Fixes #9980. Fixes #10303. Fixes #10731.
---
mypy/semanal.py | 11 +++++--
mypy/typeanal.py | 3 +-
test-data/unit/check-generic-alias.test | 43 +++++++++++++++++++++++++
3 files changed, 53 insertions(+), 4 deletions(-)

--- a/mypy/semanal.py
+++ b/mypy/semanal.py
@@ -76,7 +76,7 @@
get_nongen_builtins, get_member_expr_fullname, REVEAL_TYPE,
REVEAL_LOCALS, is_final_node, TypedDictExpr, type_aliases_source_versions,
EnumCallExpr, RUNTIME_PROTOCOL_DECOS, FakeExpression, Statement, AssignmentExpr,
- ParamSpecExpr
+ ParamSpecExpr, EllipsisExpr
)
from mypy.tvar_scope import TypeVarLikeScope
from mypy.typevars import fill_typevars
@@ -91,7 +91,8 @@
FunctionLike, UnboundType, TypeVarDef, TupleType, UnionType, StarType,
CallableType, Overloaded, Instance, Type, AnyType, LiteralType, LiteralValue,
TypeTranslator, TypeOfAny, TypeType, NoneType, PlaceholderType, TPDICT_NAMES, ProperType,
- get_proper_type, get_proper_types, TypeAliasType)
+ get_proper_type, get_proper_types, TypeAliasType
+)
from mypy.typeops import function_type
from mypy.type_visitor import TypeQuery
from mypy.nodes import implicit_module_attrs
@@ -3844,7 +3845,8 @@
# ...or directly.
else:
n = self.lookup_type_node(base)
- if n and n.fullname in get_nongen_builtins(self.options.python_version):
+ if (n and n.fullname in get_nongen_builtins(self.options.python_version) and
+ not self.is_stub_file):
self.fail(no_subscript_builtin_alias(n.fullname, propose_alt=False), expr)

def analyze_type_application_args(self, expr: IndexExpr) -> Optional[List[Type]]:
@@ -3860,6 +3862,9 @@
types = [] # type: List[Type]
if isinstance(index, TupleExpr):
items = index.items
+ is_tuple = isinstance(expr.base, RefExpr) and expr.base.fullname == 'builtins.tuple'
+ if is_tuple and len(items) == 2 and isinstance(items[-1], EllipsisExpr):
+ items = items[:-1]
else:
items = [index]
for item in items:
--- a/mypy/typeanal.py
+++ b/mypy/typeanal.py
@@ -281,7 +281,8 @@
return AnyType(TypeOfAny.from_error)
elif (fullname == 'typing.Tuple' or
(fullname == 'builtins.tuple' and (self.options.python_version >= (3, 9) or
- self.api.is_future_flag_set('annotations')))):
+ self.api.is_future_flag_set('annotations') or
+ self.allow_unnormalized))):
# Tuple is special because it is involved in builtin import cycle
# and may be not ready when used.
sym = self.api.lookup_fully_qualified_or_none('builtins.tuple')
--- a/test-data/unit/check-generic-alias.test
+++ b/test-data/unit/check-generic-alias.test
@@ -239,3 +239,46 @@
from typing import Tuple
t10: Tuple[int, ...] = t09
[builtins fixtures/tuple.pyi]
+
+[case testTypeAliasWithBuiltinTuple]
+# flags: --python-version 3.9
+
+A = tuple[int, ...]
+a: A = ()
+b: A = (1, 2, 3)
+c: A = ('x', 'y') # E: Incompatible types in assignment (expression has type "Tuple[str, str]", variable has type "Tuple[int, ...]")
+
+B = tuple[int, str]
+x: B = (1, 'x')
+y: B = ('x', 1) # E: Incompatible types in assignment (expression has type "Tuple[str, int]", variable has type "Tuple[int, str]")
+
+reveal_type(tuple[int, ...]()) # N: Revealed type is "builtins.tuple[builtins.int*]"
+[builtins fixtures/tuple.pyi]
+
+[case testTypeAliasWithBuiltinTupleInStub]
+# flags: --python-version 3.6
+import m
+reveal_type(m.a) # N: Revealed type is "builtins.tuple[builtins.int]"
+reveal_type(m.b) # N: Revealed type is "Tuple[builtins.int, builtins.str]"
+
+[file m.pyi]
+A = tuple[int, ...]
+a: A
+B = tuple[int, str]
+b: B
+[builtins fixtures/tuple.pyi]
+
+[case testTypeAliasWithBuiltinListInStub]
+# flags: --python-version 3.6
+import m
+reveal_type(m.a) # N: Revealed type is "builtins.list[builtins.int]"
+reveal_type(m.b) # N: Revealed type is "builtins.list[builtins.list[builtins.int]]"
+
+[file m.pyi]
+A = list[int]
+a: A
+B = list[list[int]]
+b: B
+class C(list[int]):
+ pass
+[builtins fixtures/list.pyi]
1 change: 1 addition & 0 deletions debian/patches/series
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
verbose
intersphinx
issue-11355.diff
issue-9980.diff

0 comments on commit 418a8c4

Please sign in to comment.