From c7b8d719ef520cf67e1007cd9c8f6c91de798be6 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 30 May 2017 09:30:13 -0700 Subject: [PATCH 1/3] Make return type of open() more precise --- mypy/funcplugins.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mypy/funcplugins.py b/mypy/funcplugins.py index 7d5c25248e0a..b1113ab30ae9 100644 --- a/mypy/funcplugins.py +++ b/mypy/funcplugins.py @@ -44,7 +44,7 @@ def open_callback( named_generic_type: Callable[[str, List[Type]], Type]) -> Type: """Infer a better return type for 'open'. - Infer IO[str] or IO[bytes] as the return value if the mode argument is not + Infer TextIO or BinaryIO as the return value if the mode argument is not given or is a literal. """ mode = None @@ -55,10 +55,9 @@ def open_callback( if mode is not None: assert isinstance(inferred_return_type, Instance) if 'b' in mode: - arg = named_generic_type('builtins.bytes', []) + return named_generic_type('typing.BinaryIO', []) else: - arg = named_generic_type('builtins.str', []) - return Instance(inferred_return_type.type, [arg]) + return named_generic_type('typing.TextIO', []) return inferred_return_type From 6883fbb746c8bb2f4c0f040a70c7744c0d097abb Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 30 May 2017 09:41:58 -0700 Subject: [PATCH 2/3] Fix unit tests --- test-data/unit/pythoneval.test | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test-data/unit/pythoneval.test b/test-data/unit/pythoneval.test index be05dafe20c8..6f93b5acb972 100644 --- a/test-data/unit/pythoneval.test +++ b/test-data/unit/pythoneval.test @@ -400,7 +400,7 @@ f.write(b'x') f.foobar() [out] _program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str" -_program.py:4: error: IO[str] has no attribute "foobar" +_program.py:4: error: TextIO has no attribute "foobar" [case testOpenReturnTypeInference] reveal_type(open('x')) @@ -409,9 +409,9 @@ reveal_type(open('x', 'rb')) mode = 'rb' reveal_type(open('x', mode)) [out] -_program.py:1: error: Revealed type is 'typing.IO[builtins.str]' -_program.py:2: error: Revealed type is 'typing.IO[builtins.str]' -_program.py:3: error: Revealed type is 'typing.IO[builtins.bytes]' +_program.py:1: error: Revealed type is 'typing.TextIO' +_program.py:2: error: Revealed type is 'typing.TextIO' +_program.py:3: error: Revealed type is 'typing.BinaryIO' _program.py:5: error: Revealed type is 'typing.IO[Any]' [case testOpenReturnTypeInferenceSpecialCases] @@ -421,10 +421,10 @@ reveal_type(open(file='x', mode='rb')) mode = 'rb' reveal_type(open(mode=mode, file='r')) [out] -_testOpenReturnTypeInferenceSpecialCases.py:1: error: Revealed type is 'typing.IO[builtins.str]' +_testOpenReturnTypeInferenceSpecialCases.py:1: error: Revealed type is 'typing.TextIO' _testOpenReturnTypeInferenceSpecialCases.py:1: error: Too few arguments for "open" -_testOpenReturnTypeInferenceSpecialCases.py:2: error: Revealed type is 'typing.IO[builtins.bytes]' -_testOpenReturnTypeInferenceSpecialCases.py:3: error: Revealed type is 'typing.IO[builtins.bytes]' +_testOpenReturnTypeInferenceSpecialCases.py:2: error: Revealed type is 'typing.BinaryIO' +_testOpenReturnTypeInferenceSpecialCases.py:3: error: Revealed type is 'typing.BinaryIO' _testOpenReturnTypeInferenceSpecialCases.py:5: error: Revealed type is 'typing.IO[Any]' [case testGenericPatterns] From 0ad330e1e07f8ef29c56a8c0d0d38e3e9a199f95 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 30 May 2017 09:48:15 -0700 Subject: [PATCH 3/3] Fix unit tests good --- test-data/unit/pythoneval.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-data/unit/pythoneval.test b/test-data/unit/pythoneval.test index 6f93b5acb972..c9ee1f322a28 100644 --- a/test-data/unit/pythoneval.test +++ b/test-data/unit/pythoneval.test @@ -400,7 +400,7 @@ f.write(b'x') f.foobar() [out] _program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str" -_program.py:4: error: TextIO has no attribute "foobar" +_program.py:4: error: "TextIO" has no attribute "foobar" [case testOpenReturnTypeInference] reveal_type(open('x'))