Skip to content

Commit 723fcb3

Browse files
authored
pathlib.Path.open: bring on the overloads (#4407)
1 parent 189bdfb commit 723fcb3

File tree

2 files changed

+148
-48
lines changed

2 files changed

+148
-48
lines changed

stdlib/3/pathlib.pyi

Lines changed: 74 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import os
22
import sys
3-
from _typeshed import OpenBinaryMode, OpenTextMode
3+
from _typeshed import OpenBinaryMode, OpenBinaryModeReading, OpenBinaryModeUpdating, OpenBinaryModeWriting, OpenTextMode
4+
from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper
45
from types import TracebackType
5-
from typing import IO, Any, BinaryIO, Generator, List, Optional, Sequence, TextIO, Tuple, Type, TypeVar, Union, overload
6+
from typing import IO, Any, BinaryIO, Generator, List, Optional, Sequence, Text, TextIO, Tuple, Type, TypeVar, Union, overload
7+
from typing_extensions import Literal
68

79
_P = TypeVar("_P", bound=PurePath)
810

@@ -83,28 +85,76 @@ class Path(PurePath):
8385
def mkdir(self, mode: int = ..., parents: bool = ...) -> None: ...
8486
else:
8587
def mkdir(self, mode: int = ..., parents: bool = ..., exist_ok: bool = ...) -> None: ...
86-
@overload
87-
def open(
88-
self,
89-
mode: OpenTextMode = ...,
90-
buffering: int = ...,
91-
encoding: Optional[str] = ...,
92-
errors: Optional[str] = ...,
93-
newline: Optional[str] = ...,
94-
) -> TextIO: ...
95-
@overload
96-
def open(
97-
self, mode: OpenBinaryMode, buffering: int = ..., encoding: None = ..., errors: None = ..., newline: None = ...
98-
) -> BinaryIO: ...
99-
@overload
100-
def open(
101-
self,
102-
mode: str,
103-
buffering: int = ...,
104-
encoding: Optional[str] = ...,
105-
errors: Optional[str] = ...,
106-
newline: Optional[str] = ...,
107-
) -> IO[Any]: ...
88+
if sys.version_info >= (3,):
89+
# Adapted from builtins.open
90+
# Text mode: always returns a TextIOWrapper
91+
@overload
92+
def open(
93+
self,
94+
mode: OpenTextMode = ...,
95+
buffering: int = ...,
96+
encoding: Optional[str] = ...,
97+
errors: Optional[str] = ...,
98+
newline: Optional[str] = ...,
99+
) -> TextIOWrapper: ...
100+
# Unbuffered binary mode: returns a FileIO
101+
@overload
102+
def open(
103+
self, mode: OpenBinaryMode, buffering: Literal[0], encoding: None = ..., errors: None = ..., newline: None = ...,
104+
) -> FileIO: ...
105+
# Buffering is on: return BufferedRandom, BufferedReader, or BufferedWriter
106+
@overload
107+
def open(
108+
self,
109+
mode: OpenBinaryModeUpdating,
110+
buffering: Literal[-1, 1] = ...,
111+
encoding: None = ...,
112+
errors: None = ...,
113+
newline: None = ...,
114+
) -> BufferedRandom: ...
115+
@overload
116+
def open(
117+
self,
118+
mode: OpenBinaryModeWriting,
119+
buffering: Literal[-1, 1] = ...,
120+
encoding: None = ...,
121+
errors: None = ...,
122+
newline: None = ...,
123+
) -> BufferedWriter: ...
124+
@overload
125+
def open(
126+
self,
127+
mode: OpenBinaryModeReading,
128+
buffering: Literal[-1, 1] = ...,
129+
encoding: None = ...,
130+
errors: None = ...,
131+
newline: None = ...,
132+
) -> BufferedReader: ...
133+
# Buffering cannot be determined: fall back to BinaryIO
134+
@overload
135+
def open(
136+
self, mode: OpenBinaryMode, buffering: int, encoding: None = ..., errors: None = ..., newline: None = ...,
137+
) -> BinaryIO: ...
138+
# Fallback if mode is not specified
139+
@overload
140+
def open(
141+
self,
142+
mode: str,
143+
buffering: int = ...,
144+
encoding: Optional[str] = ...,
145+
errors: Optional[str] = ...,
146+
newline: Optional[str] = ...,
147+
) -> IO[Any]: ...
148+
else:
149+
# Adapted from _io.open
150+
def open(
151+
self,
152+
mode: Text = ...,
153+
buffering: int = ...,
154+
encoding: Optional[Text] = ...,
155+
errors: Optional[Text] = ...,
156+
newline: Optional[Text] = ...,
157+
) -> IO[Any]: ...
108158
def owner(self) -> str: ...
109159
if sys.version_info >= (3, 9):
110160
def readlink(self: _P) -> _P: ...

third_party/2/pathlib2.pyi

Lines changed: 74 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import os
22
import sys
3-
from _typeshed import OpenBinaryMode, OpenTextMode
3+
from _typeshed import OpenBinaryMode, OpenBinaryModeReading, OpenBinaryModeUpdating, OpenBinaryModeWriting, OpenTextMode
4+
from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper
45
from types import TracebackType
5-
from typing import IO, Any, BinaryIO, Generator, List, Optional, Sequence, TextIO, Tuple, Type, TypeVar, Union, overload
6+
from typing import IO, Any, BinaryIO, Generator, List, Optional, Sequence, Text, TextIO, Tuple, Type, TypeVar, Union, overload
7+
from typing_extensions import Literal
68

79
_P = TypeVar("_P", bound=PurePath)
810

@@ -83,28 +85,76 @@ class Path(PurePath):
8385
def mkdir(self, mode: int = ..., parents: bool = ...) -> None: ...
8486
else:
8587
def mkdir(self, mode: int = ..., parents: bool = ..., exist_ok: bool = ...) -> None: ...
86-
@overload
87-
def open(
88-
self,
89-
mode: OpenTextMode = ...,
90-
buffering: int = ...,
91-
encoding: Optional[str] = ...,
92-
errors: Optional[str] = ...,
93-
newline: Optional[str] = ...,
94-
) -> TextIO: ...
95-
@overload
96-
def open(
97-
self, mode: OpenBinaryMode, buffering: int = ..., encoding: None = ..., errors: None = ..., newline: None = ...
98-
) -> BinaryIO: ...
99-
@overload
100-
def open(
101-
self,
102-
mode: str,
103-
buffering: int = ...,
104-
encoding: Optional[str] = ...,
105-
errors: Optional[str] = ...,
106-
newline: Optional[str] = ...,
107-
) -> IO[Any]: ...
88+
if sys.version_info >= (3,):
89+
# Adapted from builtins.open
90+
# Text mode: always returns a TextIOWrapper
91+
@overload
92+
def open(
93+
self,
94+
mode: OpenTextMode = ...,
95+
buffering: int = ...,
96+
encoding: Optional[str] = ...,
97+
errors: Optional[str] = ...,
98+
newline: Optional[str] = ...,
99+
) -> TextIOWrapper: ...
100+
# Unbuffered binary mode: returns a FileIO
101+
@overload
102+
def open(
103+
self, mode: OpenBinaryMode, buffering: Literal[0], encoding: None = ..., errors: None = ..., newline: None = ...,
104+
) -> FileIO: ...
105+
# Buffering is on: return BufferedRandom, BufferedReader, or BufferedWriter
106+
@overload
107+
def open(
108+
self,
109+
mode: OpenBinaryModeUpdating,
110+
buffering: Literal[-1, 1] = ...,
111+
encoding: None = ...,
112+
errors: None = ...,
113+
newline: None = ...,
114+
) -> BufferedRandom: ...
115+
@overload
116+
def open(
117+
self,
118+
mode: OpenBinaryModeWriting,
119+
buffering: Literal[-1, 1] = ...,
120+
encoding: None = ...,
121+
errors: None = ...,
122+
newline: None = ...,
123+
) -> BufferedWriter: ...
124+
@overload
125+
def open(
126+
self,
127+
mode: OpenBinaryModeReading,
128+
buffering: Literal[-1, 1] = ...,
129+
encoding: None = ...,
130+
errors: None = ...,
131+
newline: None = ...,
132+
) -> BufferedReader: ...
133+
# Buffering cannot be determined: fall back to BinaryIO
134+
@overload
135+
def open(
136+
self, mode: OpenBinaryMode, buffering: int, encoding: None = ..., errors: None = ..., newline: None = ...,
137+
) -> BinaryIO: ...
138+
# Fallback if mode is not specified
139+
@overload
140+
def open(
141+
self,
142+
mode: str,
143+
buffering: int = ...,
144+
encoding: Optional[str] = ...,
145+
errors: Optional[str] = ...,
146+
newline: Optional[str] = ...,
147+
) -> IO[Any]: ...
148+
else:
149+
# Adapted from _io.open
150+
def open(
151+
self,
152+
mode: Text = ...,
153+
buffering: int = ...,
154+
encoding: Optional[Text] = ...,
155+
errors: Optional[Text] = ...,
156+
newline: Optional[Text] = ...,
157+
) -> IO[Any]: ...
108158
def owner(self) -> str: ...
109159
if sys.version_info >= (3, 9):
110160
def readlink(self: _P) -> _P: ...

0 commit comments

Comments
 (0)