Skip to content

Commit 9796b9e

Browse files
authored
Improve open overloads when mode is a literal union (#7428)
As pointed out by @gvanrossum in python/typing#1096 Improves type inference in cases when we know that mode is OpenBinaryMode, but don't know anything more specific: ``` def my_open(name: str, write: bool): mode: Literal['rb', 'wb'] = 'wb' if write else 'rb' with open(name, mode) as f: reveal_type(f) # previously typing.IO[Any], now typing.BinaryIO ``` You may be tempted into thinking this is some limitation of type checkers. mypy does in fact have logic for detecting if we match multiple overloads and union-ing up the return types of matched overloads. The problem is the last overload interferes with this logic. That is, if you remove the fallback overload (prior to this PR), you'd get "Union[io.BufferedReader, io.BufferedWriter]" in the above example. Co-authored-by: hauntsaninja <>
1 parent b9909b1 commit 9796b9e

File tree

5 files changed

+5
-5
lines changed

5 files changed

+5
-5
lines changed

stdlib/builtins.pyi

+1-1
Original file line numberDiff line numberDiff line change
@@ -1308,7 +1308,7 @@ def open(
13081308
def open(
13091309
file: _OpenFile,
13101310
mode: OpenBinaryMode,
1311-
buffering: int,
1311+
buffering: int = ...,
13121312
encoding: None = ...,
13131313
errors: None = ...,
13141314
newline: None = ...,

stdlib/importlib/abc.pyi

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ if sys.version_info >= (3, 9):
158158
@overload
159159
@abstractmethod
160160
def open(
161-
self, mode: OpenBinaryMode, buffering: int, encoding: None = ..., errors: None = ..., newline: None = ...
161+
self, mode: OpenBinaryMode, buffering: int = ..., encoding: None = ..., errors: None = ..., newline: None = ...
162162
) -> BinaryIO: ...
163163
# Fallback if mode is not specified
164164
@overload

stdlib/os/__init__.pyi

+1-1
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ def fdopen(
570570
def fdopen(
571571
fd: int,
572572
mode: OpenBinaryMode,
573-
buffering: int,
573+
buffering: int = ...,
574574
encoding: None = ...,
575575
errors: None = ...,
576576
newline: None = ...,

stdlib/pathlib.pyi

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class Path(PurePath):
147147
# Buffering cannot be determined: fall back to BinaryIO
148148
@overload
149149
def open(
150-
self, mode: OpenBinaryMode, buffering: int, encoding: None = ..., errors: None = ..., newline: None = ...
150+
self, mode: OpenBinaryMode, buffering: int = ..., encoding: None = ..., errors: None = ..., newline: None = ...
151151
) -> BinaryIO: ...
152152
# Fallback if mode is not specified
153153
@overload

stubs/aiofiles/aiofiles/threadpool/__init__.pyi

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def open(
8686
def open(
8787
file: _OpenFile,
8888
mode: OpenBinaryMode,
89-
buffering: int,
89+
buffering: int = ...,
9090
encoding: None = ...,
9191
errors: None = ...,
9292
newline: None = ...,

0 commit comments

Comments
 (0)