Skip to content

Commit f36d01e

Browse files
committed
Added type hints
1 parent 8c7be25 commit f36d01e

22 files changed

+139
-97
lines changed

docs/reference/ImageFile.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ Classes
5757
:undoc-members:
5858
:show-inheritance:
5959

60+
.. autoclass:: PIL.ImageFile.StubHandler()
61+
:members:
62+
:show-inheritance:
63+
6064
.. autoclass:: PIL.ImageFile.StubImageFile()
6165
:members:
6266
:show-inheritance:

setup.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ def _add_directory(path, subdir, where=None):
215215
path.insert(where, subdir)
216216

217217

218-
def _find_include_file(self, include):
218+
def _find_include_file(self, include: str) -> int:
219219
for directory in self.compiler.include_dirs:
220220
_dbg("Checking for include file %s in %s", (include, directory))
221221
if os.path.isfile(os.path.join(directory, include)):
@@ -255,7 +255,7 @@ def _cmd_exists(cmd: str) -> bool:
255255
)
256256

257257

258-
def _pkg_config(name):
258+
def _pkg_config(name: str) -> tuple[str, str] | None:
259259
command = os.environ.get("PKG_CONFIG", "pkg-config")
260260
for keep_system in (True, False):
261261
try:
@@ -282,6 +282,7 @@ def _pkg_config(name):
282282
return libs, cflags
283283
except Exception:
284284
pass
285+
return None
285286

286287

287288
class pil_build_ext(build_ext):

src/PIL/BlpImagePlugin.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class AlphaEncoding(IntEnum):
5555
DXT5 = 7
5656

5757

58-
def unpack_565(i):
58+
def unpack_565(i: int) -> tuple[int, int, int]:
5959
return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3
6060

6161

@@ -284,7 +284,8 @@ def decode(self, buffer):
284284
raise OSError(msg) from e
285285
return -1, 0
286286

287-
def _read_blp_header(self):
287+
def _read_blp_header(self) -> None:
288+
assert self.fd is not None
288289
self.fd.seek(4)
289290
(self._blp_compression,) = struct.unpack("<i", self._safe_read(4))
290291

@@ -303,10 +304,10 @@ def _read_blp_header(self):
303304
self._blp_offsets = struct.unpack("<16I", self._safe_read(16 * 4))
304305
self._blp_lengths = struct.unpack("<16I", self._safe_read(16 * 4))
305306

306-
def _safe_read(self, length):
307+
def _safe_read(self, length: int) -> bytes:
307308
return ImageFile._safe_read(self.fd, length)
308309

309-
def _read_palette(self):
310+
def _read_palette(self) -> list[tuple[int, int, int, int]]:
310311
ret = []
311312
for i in range(256):
312313
try:
@@ -349,29 +350,30 @@ def _load(self) -> None:
349350
msg = f"Unsupported BLP compression {repr(self._blp_encoding)}"
350351
raise BLPFormatError(msg)
351352

352-
def _decode_jpeg_stream(self):
353+
def _decode_jpeg_stream(self) -> None:
353354
from .JpegImagePlugin import JpegImageFile
354355

355356
(jpeg_header_size,) = struct.unpack("<I", self._safe_read(4))
356357
jpeg_header = self._safe_read(jpeg_header_size)
358+
assert self.fd is not None
357359
self._safe_read(self._blp_offsets[0] - self.fd.tell()) # What IS this?
358360
data = self._safe_read(self._blp_lengths[0])
359361
data = jpeg_header + data
360-
data = BytesIO(data)
361-
image = JpegImageFile(data)
362+
image = JpegImageFile(BytesIO(data))
362363
Image._decompression_bomb_check(image.size)
363364
if image.mode == "CMYK":
364365
decoder_name, extents, offset, args = image.tile[0]
365366
image.tile = [(decoder_name, extents, offset, (args[0], "CMYK"))]
366367
r, g, b = image.convert("RGB").split()
367-
image = Image.merge("RGB", (b, g, r))
368-
self.set_as_raw(image.tobytes())
368+
reversed_image = Image.merge("RGB", (b, g, r))
369+
self.set_as_raw(reversed_image.tobytes())
369370

370371

371372
class BLP2Decoder(_BLPBaseDecoder):
372-
def _load(self):
373+
def _load(self) -> None:
373374
palette = self._read_palette()
374375

376+
assert self.fd is not None
375377
self.fd.seek(self._blp_offsets[0])
376378

377379
if self._blp_compression == 1:

src/PIL/BufrStubImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
_handler = None
1616

1717

18-
def register_handler(handler):
18+
def register_handler(handler: ImageFile.StubHandler) -> None:
1919
"""
2020
Install application-specific BUFR image handler.
2121
@@ -54,7 +54,7 @@ def _open(self) -> None:
5454
if loader:
5555
loader.open(self)
5656

57-
def _load(self):
57+
def _load(self) -> ImageFile.StubHandler | None:
5858
return _handler
5959

6060

src/PIL/DcxImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class DcxImageFile(PcxImageFile):
4242
format_description = "Intel DCX"
4343
_close_exclusive_fp_after_loading = False
4444

45-
def _open(self):
45+
def _open(self) -> None:
4646
# Header
4747
s = self.fp.read(4)
4848
if not _accept(s):
@@ -58,7 +58,7 @@ def _open(self):
5858
self._offset.append(offset)
5959

6060
self._fp = self.fp
61-
self.frame = None
61+
self.frame = -1
6262
self.n_frames = len(self._offset)
6363
self.is_animated = self.n_frames > 1
6464
self.seek(0)

src/PIL/GimpPaletteFile.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from __future__ import annotations
1717

1818
import re
19+
from typing import IO
1920

2021
from ._binary import o8
2122

@@ -25,8 +26,8 @@ class GimpPaletteFile:
2526

2627
rawmode = "RGB"
2728

28-
def __init__(self, fp):
29-
self.palette = [o8(i) * 3 for i in range(256)]
29+
def __init__(self, fp: IO[bytes]) -> None:
30+
palette = [o8(i) * 3 for i in range(256)]
3031

3132
if fp.readline()[:12] != b"GIMP Palette":
3233
msg = "not a GIMP palette file"
@@ -49,9 +50,9 @@ def __init__(self, fp):
4950
msg = "bad palette entry"
5051
raise ValueError(msg)
5152

52-
self.palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2])
53+
palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2])
5354

54-
self.palette = b"".join(self.palette)
55+
self.palette = b"".join(palette)
5556

5657
def getpalette(self) -> tuple[bytes, str]:
5758
return self.palette, self.rawmode

src/PIL/GribStubImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
_handler = None
1616

1717

18-
def register_handler(handler):
18+
def register_handler(handler: ImageFile.StubHandler) -> None:
1919
"""
2020
Install application-specific GRIB image handler.
2121
@@ -54,7 +54,7 @@ def _open(self) -> None:
5454
if loader:
5555
loader.open(self)
5656

57-
def _load(self):
57+
def _load(self) -> ImageFile.StubHandler | None:
5858
return _handler
5959

6060

src/PIL/Hdf5StubImagePlugin.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
#
1111
from __future__ import annotations
1212

13+
from typing import IO
14+
1315
from . import Image, ImageFile
1416

1517
_handler = None
1618

1719

18-
def register_handler(handler):
20+
def register_handler(handler: ImageFile.StubHandler) -> None:
1921
"""
2022
Install application-specific HDF5 image handler.
2123
@@ -54,11 +56,11 @@ def _open(self) -> None:
5456
if loader:
5557
loader.open(self)
5658

57-
def _load(self):
59+
def _load(self) -> ImageFile.StubHandler | None:
5860
return _handler
5961

6062

61-
def _save(im, fp, filename):
63+
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
6264
if _handler is None or not hasattr(_handler, "save"):
6365
msg = "HDF5 save handler not installed"
6466
raise OSError(msg)

src/PIL/Image.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1948,7 +1948,9 @@ def putalpha(self, alpha):
19481948

19491949
self.im.putband(alpha.im, band)
19501950

1951-
def putdata(self, data, scale=1.0, offset=0.0):
1951+
def putdata(
1952+
self, data: Sequence[float], scale: float = 1.0, offset: float = 0.0
1953+
) -> None:
19521954
"""
19531955
Copies pixel data from a flattened sequence object into the image. The
19541956
values should start at the upper left corner (0, 0), continue to the

src/PIL/ImageFile.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#
2929
from __future__ import annotations
3030

31+
import abc
3132
import io
3233
import itertools
3334
import struct
@@ -347,6 +348,15 @@ def _seek_check(self, frame):
347348
return self.tell() != frame
348349

349350

351+
class StubHandler:
352+
def open(self, im: StubImageFile) -> None:
353+
pass
354+
355+
@abc.abstractmethod
356+
def load(self, im: StubImageFile) -> Image.Image:
357+
pass
358+
359+
350360
class StubImageFile(ImageFile):
351361
"""
352362
Base class for stub image loaders.

0 commit comments

Comments
 (0)