Skip to content

Commit e40e823

Browse files
author
hauntsaninja
committed
Improve open overloads when mode is a literal union
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.
1 parent a5ec3c6 commit e40e823

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
@@ -568,7 +568,7 @@ def fdopen(
568568
def fdopen(
569569
fd: int,
570570
mode: OpenBinaryMode,
571-
buffering: int,
571+
buffering: int = ...,
572572
encoding: None = ...,
573573
errors: None = ...,
574574
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)