From 19572a7d7586389a2dd0e7a520978e899a06370c Mon Sep 17 00:00:00 2001 From: Ekin Dursun Date: Thu, 11 Apr 2019 14:40:25 +0300 Subject: [PATCH 1/6] Fix --- mypy/checker.py | 2 ++ test-data/unit/check-isinstance.test | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/mypy/checker.py b/mypy/checker.py index 83dc2ead9035..4d85e96f9686 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -3949,6 +3949,8 @@ def flatten(t: Expression) -> List[Expression]: """Flatten a nested sequence of tuples/lists into one list of nodes.""" if isinstance(t, TupleExpr) or isinstance(t, ListExpr): return [b for a in t.items for b in flatten(a)] + elif isinstance(t, StarExpr): + return flatten(t.expr) else: return [t] diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index 6066eefbe29b..bb293affcba0 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -2207,3 +2207,11 @@ def bar(x: Union[List[str], List[int], None]) -> None: assert isinstance(x, list) reveal_type(x) # E: Revealed type is 'Union[builtins.list[builtins.str], builtins.list[builtins.int]]' [builtins fixtures/isinstancelist.pyi] + +[case testIsInstanceWithStarExpression] +some_types = (str, tuple) +another_type = list +var = 'some string' +if isinstance(var, (*some_types, another_type)): + reveal_type(var) # E: Revealed type is 'builtins.str' +[builtins fixtures/isinstancelist.pyi] From 704cf27549d1b5fe81930517ec4a72c15a714c48 Mon Sep 17 00:00:00 2001 From: Ekin Dursun Date: Thu, 11 Apr 2019 17:22:45 +0300 Subject: [PATCH 2/6] Add tests --- test-data/unit/check-isinstance.test | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index bb293affcba0..7ccf57109141 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -2209,9 +2209,23 @@ def bar(x: Union[List[str], List[int], None]) -> None: [builtins fixtures/isinstancelist.pyi] [case testIsInstanceWithStarExpression] +var = 'some string' +if isinstance(var, (list, *(str, int))): + reveal_type(var) # E: Revealed type is 'builtins.str' +[builtins fixtures/isinstancelist.pyi] + +[case testIsInstanceWithStarExpressionAndVariable] some_types = (str, tuple) another_type = list var = 'some string' if isinstance(var, (*some_types, another_type)): reveal_type(var) # E: Revealed type is 'builtins.str' [builtins fixtures/isinstancelist.pyi] + +[case testIsInstanceWithWrongStarExpression] +var = 'some string' +if isinstance(var, *(str, int)): # E: Too many arguments for "isinstance" + pass +[builtins fixtures/isinstancelist.pyi] + + From 8d20e8133bb53cc284d1743e5fc8d894af81256a Mon Sep 17 00:00:00 2001 From: Ekin Dursun Date: Thu, 11 Apr 2019 17:24:58 +0300 Subject: [PATCH 3/6] Remove empty lines --- test-data/unit/check-isinstance.test | 2 -- test.py | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 test.py diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index 7ccf57109141..aecbe35c842d 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -2227,5 +2227,3 @@ var = 'some string' if isinstance(var, *(str, int)): # E: Too many arguments for "isinstance" pass [builtins fixtures/isinstancelist.pyi] - - diff --git a/test.py b/test.py new file mode 100644 index 000000000000..0bf280ced481 --- /dev/null +++ b/test.py @@ -0,0 +1,4 @@ +two_types = (list, tuple) +third_type = str +if isinstance('text', *(str, int)): + print('hello') From 42e09296eb771d30fa29f1d3c03aa6db3fc7f1da Mon Sep 17 00:00:00 2001 From: Ekin Dursun Date: Thu, 11 Apr 2019 17:25:39 +0300 Subject: [PATCH 4/6] Remove accidentally added file --- test.py | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 test.py diff --git a/test.py b/test.py deleted file mode 100644 index 0bf280ced481..000000000000 --- a/test.py +++ /dev/null @@ -1,4 +0,0 @@ -two_types = (list, tuple) -third_type = str -if isinstance('text', *(str, int)): - print('hello') From 80d7811923f19d6152e3a951c2c69cedd5cf282b Mon Sep 17 00:00:00 2001 From: Ekin Dursun Date: Fri, 12 Apr 2019 10:20:36 +0300 Subject: [PATCH 5/6] Improve tests --- test-data/unit/check-isinstance.test | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index aecbe35c842d..a2aca14a2cb4 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -2209,17 +2209,25 @@ def bar(x: Union[List[str], List[int], None]) -> None: [builtins fixtures/isinstancelist.pyi] [case testIsInstanceWithStarExpression] -var = 'some string' -if isinstance(var, (list, *(str, int))): - reveal_type(var) # E: Revealed type is 'builtins.str' +from typing import Union, List, Tuple + + +def f(var: Union[List[str], Tuple[str, str], str]) -> None: + reveal_type(var) # E: Revealed type is 'Union[builtins.list[builtins.str], Tuple[builtins.str, builtins.str], builtins.str]' + if isinstance(var, (list, *(str, int))): + reveal_type(var) # E: Revealed type is 'Union[builtins.list[builtins.str], builtins.str]' [builtins fixtures/isinstancelist.pyi] [case testIsInstanceWithStarExpressionAndVariable] -some_types = (str, tuple) -another_type = list -var = 'some string' -if isinstance(var, (*some_types, another_type)): - reveal_type(var) # E: Revealed type is 'builtins.str' +from typing import Union + + +def f(var: Union[int, str]) -> None: + reveal_type(var) # E: Revealed type is 'Union[builtins.int, builtins.str]' + some_types = (str, tuple) + another_type = list + if isinstance(var, (*some_types, another_type)): + reveal_type(var) # E: Revealed type is 'builtins.str' [builtins fixtures/isinstancelist.pyi] [case testIsInstanceWithWrongStarExpression] From 4d0126c98eb375c786bb296a3ddfd0da0ced54d0 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Fri, 12 Apr 2019 13:22:51 +0100 Subject: [PATCH 6/6] Remove extra blank lines --- test-data/unit/check-isinstance.test | 2 -- 1 file changed, 2 deletions(-) diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index a2aca14a2cb4..c14a49d60d27 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -2211,7 +2211,6 @@ def bar(x: Union[List[str], List[int], None]) -> None: [case testIsInstanceWithStarExpression] from typing import Union, List, Tuple - def f(var: Union[List[str], Tuple[str, str], str]) -> None: reveal_type(var) # E: Revealed type is 'Union[builtins.list[builtins.str], Tuple[builtins.str, builtins.str], builtins.str]' if isinstance(var, (list, *(str, int))): @@ -2221,7 +2220,6 @@ def f(var: Union[List[str], Tuple[str, str], str]) -> None: [case testIsInstanceWithStarExpressionAndVariable] from typing import Union - def f(var: Union[int, str]) -> None: reveal_type(var) # E: Revealed type is 'Union[builtins.int, builtins.str]' some_types = (str, tuple)