Skip to content

Commit 9e402e2

Browse files
gvanrossumJukkaL
authored andcommitted
Make return type of open() more precise (#3477)
Infer TextIO or BinaryIO as the return type of open() instead of IO[str] or IO[bytes] when we can predict the mode.
1 parent 977eeec commit 9e402e2

File tree

2 files changed

+10
-11
lines changed

2 files changed

+10
-11
lines changed

mypy/funcplugins.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def open_callback(
4444
named_generic_type: Callable[[str, List[Type]], Type]) -> Type:
4545
"""Infer a better return type for 'open'.
4646
47-
Infer IO[str] or IO[bytes] as the return value if the mode argument is not
47+
Infer TextIO or BinaryIO as the return value if the mode argument is not
4848
given or is a literal.
4949
"""
5050
mode = None
@@ -55,10 +55,9 @@ def open_callback(
5555
if mode is not None:
5656
assert isinstance(inferred_return_type, Instance)
5757
if 'b' in mode:
58-
arg = named_generic_type('builtins.bytes', [])
58+
return named_generic_type('typing.BinaryIO', [])
5959
else:
60-
arg = named_generic_type('builtins.str', [])
61-
return Instance(inferred_return_type.type, [arg])
60+
return named_generic_type('typing.TextIO', [])
6261
return inferred_return_type
6362

6463

test-data/unit/pythoneval.test

+7-7
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ f.write(b'x')
400400
f.foobar()
401401
[out]
402402
_program.py:3: error: Argument 1 to "write" of "IO" has incompatible type "bytes"; expected "str"
403-
_program.py:4: error: IO[str] has no attribute "foobar"
403+
_program.py:4: error: "TextIO" has no attribute "foobar"
404404

405405
[case testOpenReturnTypeInference]
406406
reveal_type(open('x'))
@@ -409,9 +409,9 @@ reveal_type(open('x', 'rb'))
409409
mode = 'rb'
410410
reveal_type(open('x', mode))
411411
[out]
412-
_program.py:1: error: Revealed type is 'typing.IO[builtins.str]'
413-
_program.py:2: error: Revealed type is 'typing.IO[builtins.str]'
414-
_program.py:3: error: Revealed type is 'typing.IO[builtins.bytes]'
412+
_program.py:1: error: Revealed type is 'typing.TextIO'
413+
_program.py:2: error: Revealed type is 'typing.TextIO'
414+
_program.py:3: error: Revealed type is 'typing.BinaryIO'
415415
_program.py:5: error: Revealed type is 'typing.IO[Any]'
416416

417417
[case testOpenReturnTypeInferenceSpecialCases]
@@ -421,10 +421,10 @@ reveal_type(open(file='x', mode='rb'))
421421
mode = 'rb'
422422
reveal_type(open(mode=mode, file='r'))
423423
[out]
424-
_testOpenReturnTypeInferenceSpecialCases.py:1: error: Revealed type is 'typing.IO[builtins.str]'
424+
_testOpenReturnTypeInferenceSpecialCases.py:1: error: Revealed type is 'typing.TextIO'
425425
_testOpenReturnTypeInferenceSpecialCases.py:1: error: Too few arguments for "open"
426-
_testOpenReturnTypeInferenceSpecialCases.py:2: error: Revealed type is 'typing.IO[builtins.bytes]'
427-
_testOpenReturnTypeInferenceSpecialCases.py:3: error: Revealed type is 'typing.IO[builtins.bytes]'
426+
_testOpenReturnTypeInferenceSpecialCases.py:2: error: Revealed type is 'typing.BinaryIO'
427+
_testOpenReturnTypeInferenceSpecialCases.py:3: error: Revealed type is 'typing.BinaryIO'
428428
_testOpenReturnTypeInferenceSpecialCases.py:5: error: Revealed type is 'typing.IO[Any]'
429429

430430
[case testGenericPatterns]

0 commit comments

Comments
 (0)