Skip to content

Commit 2d67995

Browse files
author
hauntsaninja
committed
pathlib.Path.open: bring on the overloads
1 parent 3b6925b commit 2d67995

File tree

2 files changed

+84
-6
lines changed

2 files changed

+84
-6
lines changed

stdlib/3/pathlib.pyi

Lines changed: 42 additions & 3 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
56
from typing import IO, Any, BinaryIO, Generator, List, Optional, Sequence, TextIO, Tuple, Type, TypeVar, Union, overload
7+
from typing_extensions import Literal
68

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

@@ -83,6 +85,8 @@ 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: ...
88+
# Adapted from builtins.open
89+
# Text mode: always returns a TextIOWrapper
8690
@overload
8791
def open(
8892
self,
@@ -91,11 +95,46 @@ class Path(PurePath):
9195
encoding: Optional[str] = ...,
9296
errors: Optional[str] = ...,
9397
newline: Optional[str] = ...,
94-
) -> TextIO: ...
98+
) -> TextIOWrapper: ...
99+
# Unbuffered binary mode: returns a FileIO
95100
@overload
96101
def open(
97-
self, mode: OpenBinaryMode, buffering: int = ..., encoding: None = ..., errors: None = ..., newline: None = ...
102+
self, mode: OpenBinaryMode, buffering: Literal[0], encoding: None = ..., errors: None = ..., newline: None = ...,
103+
) -> FileIO: ...
104+
# Buffering is on: return BufferedRandom, BufferedReader, or BufferedWriter
105+
@overload
106+
def open(
107+
self,
108+
mode: OpenBinaryModeUpdating,
109+
buffering: Literal[-1, 1] = ...,
110+
encoding: None = ...,
111+
errors: None = ...,
112+
newline: None = ...,
113+
) -> BufferedRandom: ...
114+
@overload
115+
def open(
116+
self,
117+
mode: OpenBinaryModeWriting,
118+
buffering: Literal[-1, 1] = ...,
119+
encoding: None = ...,
120+
errors: None = ...,
121+
newline: None = ...,
122+
) -> BufferedWriter: ...
123+
@overload
124+
def open(
125+
self,
126+
mode: OpenBinaryModeReading,
127+
buffering: Literal[-1, 1] = ...,
128+
encoding: None = ...,
129+
errors: None = ...,
130+
newline: None = ...,
131+
) -> BufferedReader: ...
132+
# Buffering cannot be determined: fall back to BinaryIO
133+
@overload
134+
def open(
135+
self, mode: OpenBinaryMode, buffering: int, encoding: None = ..., errors: None = ..., newline: None = ...,
98136
) -> BinaryIO: ...
137+
# Fallback if mode is not specified
99138
@overload
100139
def open(
101140
self,

third_party/2/pathlib2.pyi

Lines changed: 42 additions & 3 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
56
from typing import IO, Any, BinaryIO, Generator, List, Optional, Sequence, TextIO, Tuple, Type, TypeVar, Union, overload
7+
from typing_extensions import Literal
68

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

@@ -83,6 +85,8 @@ 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: ...
88+
# Adapted from builtins.open
89+
# Text mode: always returns a TextIOWrapper
8690
@overload
8791
def open(
8892
self,
@@ -91,11 +95,46 @@ class Path(PurePath):
9195
encoding: Optional[str] = ...,
9296
errors: Optional[str] = ...,
9397
newline: Optional[str] = ...,
94-
) -> TextIO: ...
98+
) -> TextIOWrapper: ...
99+
# Unbuffered binary mode: returns a FileIO
95100
@overload
96101
def open(
97-
self, mode: OpenBinaryMode, buffering: int = ..., encoding: None = ..., errors: None = ..., newline: None = ...
102+
self, mode: OpenBinaryMode, buffering: Literal[0], encoding: None = ..., errors: None = ..., newline: None = ...,
103+
) -> FileIO: ...
104+
# Buffering is on: return BufferedRandom, BufferedReader, or BufferedWriter
105+
@overload
106+
def open(
107+
self,
108+
mode: OpenBinaryModeUpdating,
109+
buffering: Literal[-1, 1] = ...,
110+
encoding: None = ...,
111+
errors: None = ...,
112+
newline: None = ...,
113+
) -> BufferedRandom: ...
114+
@overload
115+
def open(
116+
self,
117+
mode: OpenBinaryModeWriting,
118+
buffering: Literal[-1, 1] = ...,
119+
encoding: None = ...,
120+
errors: None = ...,
121+
newline: None = ...,
122+
) -> BufferedWriter: ...
123+
@overload
124+
def open(
125+
self,
126+
mode: OpenBinaryModeReading,
127+
buffering: Literal[-1, 1] = ...,
128+
encoding: None = ...,
129+
errors: None = ...,
130+
newline: None = ...,
131+
) -> BufferedReader: ...
132+
# Buffering cannot be determined: fall back to BinaryIO
133+
@overload
134+
def open(
135+
self, mode: OpenBinaryMode, buffering: int, encoding: None = ..., errors: None = ..., newline: None = ...,
98136
) -> BinaryIO: ...
137+
# Fallback if mode is not specified
99138
@overload
100139
def open(
101140
self,

0 commit comments

Comments
 (0)