|
1 | 1 | import os
|
2 | 2 | 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 |
4 | 5 | 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 |
6 | 8 |
|
7 | 9 | _P = TypeVar("_P", bound=PurePath)
|
8 | 10 |
|
@@ -83,28 +85,76 @@ class Path(PurePath):
|
83 | 85 | def mkdir(self, mode: int = ..., parents: bool = ...) -> None: ...
|
84 | 86 | else:
|
85 | 87 | 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]: ... |
108 | 158 | def owner(self) -> str: ...
|
109 | 159 | if sys.version_info >= (3, 9):
|
110 | 160 | def readlink(self: _P) -> _P: ...
|
|
0 commit comments