Skip to content

Commit 1af6810

Browse files
authored
Improve typing in zipfile (#5991)
* Improve typing in zipfile * fix CR suggestions
1 parent 003f916 commit 1af6810

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

stdlib/zipfile.pyi

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ from typing import IO, Any, Callable, Iterable, Iterator, Protocol, Sequence, Tu
77
from typing_extensions import Literal
88

99
_DateTuple = Tuple[int, int, int, int, int, int]
10+
_ReadWriteMode = Literal["r", "w"]
11+
_ReadWriteBinaryMode = Literal["r", "w", "rb", "wb"]
1012
_ZipFileMode = Literal["r", "w", "x", "a"]
1113

1214
class BadZipFile(Exception): ...
@@ -34,33 +36,43 @@ class ZipExtFile(io.BufferedIOBase):
3436
MAX_SEEK_READ: int
3537

3638
newlines: list[bytes] | None
37-
mode: str
39+
mode: _ReadWriteMode
3840
name: str
3941
if sys.version_info >= (3, 7):
4042
@overload
4143
def __init__(
42-
self, fileobj: _ClosableZipStream, mode: str, zipinfo: ZipInfo, pwd: bytes | None, close_fileobj: Literal[True]
44+
self,
45+
fileobj: _ClosableZipStream,
46+
mode: _ReadWriteMode,
47+
zipinfo: ZipInfo,
48+
pwd: bytes | None,
49+
close_fileobj: Literal[True],
4350
) -> None: ...
4451
@overload
4552
def __init__(
4653
self,
4754
fileobj: _ClosableZipStream,
48-
mode: str,
55+
mode: _ReadWriteMode,
4956
zipinfo: ZipInfo,
5057
pwd: bytes | None = ...,
5158
*,
5259
close_fileobj: Literal[True],
5360
) -> None: ...
5461
@overload
5562
def __init__(
56-
self, fileobj: _ZipStream, mode: str, zipinfo: ZipInfo, pwd: bytes | None = ..., close_fileobj: Literal[False] = ...
63+
self,
64+
fileobj: _ZipStream,
65+
mode: _ReadWriteMode,
66+
zipinfo: ZipInfo,
67+
pwd: bytes | None = ...,
68+
close_fileobj: Literal[False] = ...,
5769
) -> None: ...
5870
else:
5971
@overload
6072
def __init__(
6173
self,
6274
fileobj: _ClosableZipStream,
63-
mode: str,
75+
mode: _ReadWriteMode,
6476
zipinfo: ZipInfo,
6577
decrypter: Callable[[Sequence[int]], bytes] | None,
6678
close_fileobj: Literal[True],
@@ -69,7 +81,7 @@ class ZipExtFile(io.BufferedIOBase):
6981
def __init__(
7082
self,
7183
fileobj: _ClosableZipStream,
72-
mode: str,
84+
mode: _ReadWriteMode,
7385
zipinfo: ZipInfo,
7486
decrypter: Callable[[Sequence[int]], bytes] | None = ...,
7587
*,
@@ -79,7 +91,7 @@ class ZipExtFile(io.BufferedIOBase):
7991
def __init__(
8092
self,
8193
fileobj: _ZipStream,
82-
mode: str,
94+
mode: _ReadWriteMode,
8395
zipinfo: ZipInfo,
8496
decrypter: Callable[[Sequence[int]], bytes] | None = ...,
8597
close_fileobj: Literal[False] = ...,
@@ -89,6 +101,8 @@ class ZipExtFile(io.BufferedIOBase):
89101
def __repr__(self) -> str: ...
90102
def peek(self, n: int = ...) -> bytes: ...
91103
def read1(self, n: int | None) -> bytes: ... # type: ignore
104+
if sys.version_info >= (3, 7):
105+
def seek(self, offset: int, whence: int = ...) -> int: ...
92106

93107
class _Writer(Protocol):
94108
def write(self, __s: str) -> object: ...
@@ -127,7 +141,7 @@ class ZipFile:
127141
) -> None: ...
128142
else:
129143
def __init__(
130-
self, file: StrPath | IO[bytes], mode: str = ..., compression: int = ..., allowZip64: bool = ...
144+
self, file: StrPath | IO[bytes], mode: _ZipFileMode = ..., compression: int = ..., allowZip64: bool = ...
131145
) -> None: ...
132146
def __enter__(self: Self) -> Self: ...
133147
def __exit__(
@@ -138,7 +152,7 @@ class ZipFile:
138152
def infolist(self) -> list[ZipInfo]: ...
139153
def namelist(self) -> list[str]: ...
140154
def open(
141-
self, name: str | ZipInfo, mode: Literal["r", "w"] = ..., pwd: bytes | None = ..., *, force_zip64: bool = ...
155+
self, name: str | ZipInfo, mode: _ReadWriteMode = ..., pwd: bytes | None = ..., *, force_zip64: bool = ...
142156
) -> IO[bytes]: ...
143157
def extract(self, member: str | ZipInfo, path: StrPath | None = ..., pwd: bytes | None = ...) -> str: ...
144158
def extractall(
@@ -171,7 +185,7 @@ class ZipFile:
171185

172186
class PyZipFile(ZipFile):
173187
def __init__(
174-
self, file: str | IO[bytes], mode: str = ..., compression: int = ..., allowZip64: bool = ..., optimize: int = ...
188+
self, file: str | IO[bytes], mode: _ZipFileMode = ..., compression: int = ..., allowZip64: bool = ..., optimize: int = ...
175189
) -> None: ...
176190
def writepy(self, pathname: str, basename: str = ..., filterfunc: Callable[[str], bool] | None = ...) -> None: ...
177191

@@ -205,20 +219,20 @@ class ZipInfo:
205219
def FileHeader(self, zip64: bool | None = ...) -> bytes: ...
206220

207221
class _PathOpenProtocol(Protocol):
208-
def __call__(self, mode: str = ..., pwd: bytes | None = ..., *, force_zip64: bool = ...) -> IO[bytes]: ...
222+
def __call__(self, mode: _ReadWriteMode = ..., pwd: bytes | None = ..., *, force_zip64: bool = ...) -> IO[bytes]: ...
209223

210224
if sys.version_info >= (3, 8):
211225
class Path:
212226
@property
213227
def name(self) -> str: ...
214228
@property
215-
def parent(self) -> Path: ... # undocumented
229+
def parent(self) -> PathLike[str]: ... # undocumented
216230
if sys.version_info >= (3, 10):
217231
@property
218-
def filename(self) -> PathLike[str]: ...
232+
def filename(self) -> PathLike[str]: ... # undocumented
219233
def __init__(self, root: ZipFile | StrPath | IO[bytes], at: str = ...) -> None: ...
220234
if sys.version_info >= (3, 9):
221-
def open(self, mode: str = ..., *args: Any, pwd: bytes | None = ..., **kwargs: Any) -> IO[bytes]: ...
235+
def open(self, mode: _ReadWriteBinaryMode = ..., *args: Any, pwd: bytes | None = ..., **kwargs: Any) -> IO[bytes]: ...
222236
else:
223237
@property
224238
def open(self) -> _PathOpenProtocol: ...
@@ -235,7 +249,10 @@ if sys.version_info >= (3, 8):
235249
write_through: bool = ...,
236250
) -> str: ...
237251
def read_bytes(self) -> bytes: ...
238-
def joinpath(self, add: StrPath) -> Path: ... # undocumented
252+
if sys.version_info >= (3, 10):
253+
def joinpath(self, *other: StrPath) -> Path: ...
254+
else:
255+
def joinpath(self, add: StrPath) -> Path: ... # undocumented
239256
def __truediv__(self, add: StrPath) -> Path: ...
240257

241258
def is_zipfile(filename: StrPath | IO[bytes]) -> bool: ...

tests/stubtest_allowlists/py310.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ contextvars.ContextVar.set
114114
io.IncrementalNewlineDecoder.setstate
115115
random.SystemRandom.getrandbits
116116
secrets.SystemRandom.getrandbits
117-
zipfile.ZipExtFile.seek
118117
# These enums derive from (str, Enum). See comment in py3_common.txt
119118
pstats.SortKey.__new__
120119
tkinter.EventType.__new__

0 commit comments

Comments
 (0)