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 diff --git a/test-data/unit/pythoneval.test b/test-data/unit/pythoneval.test index be05dafe20c8..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: 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]