Skip to content

Commit ca1caad

Browse files
authored
Merge pull request #8105 from radarhere/type_hint
2 parents b8532e5 + 6e40601 commit ca1caad

File tree

11 files changed

+40
-29
lines changed

11 files changed

+40
-29
lines changed

src/PIL/BlpImagePlugin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import struct
3636
from enum import IntEnum
3737
from io import BytesIO
38+
from typing import IO
3839

3940
from . import Image, ImageFile
4041

@@ -448,7 +449,7 @@ def encode(self, bufsize):
448449
return len(data), 0, data
449450

450451

451-
def _save(im, fp, filename):
452+
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
452453
if im.mode != "P":
453454
msg = "Unsupported BLP image mode"
454455
raise ValueError(msg)

src/PIL/EpsImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def _open(self) -> None:
228228
reading_trailer_comments = False
229229
trailer_reached = False
230230

231-
def check_required_header_comments():
231+
def check_required_header_comments() -> None:
232232
if "PS-Adobe" not in self.info:
233233
msg = 'EPS header missing "%!PS-Adobe" comment'
234234
raise SyntaxError(msg)

src/PIL/FpxImagePlugin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def _open(self):
7070

7171
self._open_index(1)
7272

73-
def _open_index(self, index=1):
73+
def _open_index(self, index: int = 1) -> None:
7474
#
7575
# get the Image Contents Property Set
7676

@@ -85,7 +85,7 @@ def _open_index(self, index=1):
8585
size = max(self.size)
8686
i = 1
8787
while size > 64:
88-
size = size / 2
88+
size = size // 2
8989
i += 1
9090
self.maxid = i - 1
9191

@@ -118,7 +118,7 @@ def _open_index(self, index=1):
118118

119119
self._open_subimage(1, self.maxid)
120120

121-
def _open_subimage(self, index=1, subimage=0):
121+
def _open_subimage(self, index: int = 1, subimage: int = 0) -> None:
122122
#
123123
# setup tile descriptors for a given subimage
124124

src/PIL/ImageEnhance.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323

2424

2525
class _Enhance:
26-
def enhance(self, factor):
26+
image: Image.Image
27+
degenerate: Image.Image
28+
29+
def enhance(self, factor: float) -> Image.Image:
2730
"""
2831
Returns an enhanced image.
2932
@@ -46,7 +49,7 @@ class Color(_Enhance):
4649
the original image.
4750
"""
4851

49-
def __init__(self, image):
52+
def __init__(self, image: Image.Image) -> None:
5053
self.image = image
5154
self.intermediate_mode = "L"
5255
if "A" in image.getbands():
@@ -63,7 +66,7 @@ class Contrast(_Enhance):
6366
gives a solid gray image. A factor of 1.0 gives the original image.
6467
"""
6568

66-
def __init__(self, image):
69+
def __init__(self, image: Image.Image) -> None:
6770
self.image = image
6871
mean = int(ImageStat.Stat(image.convert("L")).mean[0] + 0.5)
6972
self.degenerate = Image.new("L", image.size, mean).convert(image.mode)
@@ -80,7 +83,7 @@ class Brightness(_Enhance):
8083
original image.
8184
"""
8285

83-
def __init__(self, image):
86+
def __init__(self, image: Image.Image) -> None:
8487
self.image = image
8588
self.degenerate = Image.new(image.mode, image.size, 0)
8689

@@ -96,7 +99,7 @@ class Sharpness(_Enhance):
9699
original image, and a factor of 2.0 gives a sharpened image.
97100
"""
98101

99-
def __init__(self, image):
102+
def __init__(self, image: Image.Image) -> None:
100103
self.image = image
101104
self.degenerate = image.filter(ImageFilter.SMOOTH)
102105

src/PIL/ImageFilter.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818

1919
import abc
2020
import functools
21-
from typing import Sequence
21+
from types import ModuleType
22+
from typing import Any, Sequence
2223

2324

2425
class Filter:
@@ -57,7 +58,13 @@ class Kernel(BuiltinFilter):
5758

5859
name = "Kernel"
5960

60-
def __init__(self, size, kernel, scale=None, offset=0):
61+
def __init__(
62+
self,
63+
size: tuple[int, int],
64+
kernel: Sequence[float],
65+
scale: float | None = None,
66+
offset: float = 0,
67+
) -> None:
6168
if scale is None:
6269
# default scale is sum of kernel
6370
scale = functools.reduce(lambda a, b: a + b, kernel)
@@ -194,10 +201,8 @@ class BoxBlur(MultibandFilter):
194201

195202
name = "BoxBlur"
196203

197-
def __init__(self, radius):
198-
xy = radius
199-
if not isinstance(xy, (tuple, list)):
200-
xy = (xy, xy)
204+
def __init__(self, radius: float | Sequence[float]) -> None:
205+
xy = radius if isinstance(radius, (tuple, list)) else (radius, radius)
201206
if xy[0] < 0 or xy[1] < 0:
202207
msg = "radius must be >= 0"
203208
raise ValueError(msg)
@@ -381,7 +386,9 @@ class Color3DLUT(MultibandFilter):
381386

382387
name = "Color 3D LUT"
383388

384-
def __init__(self, size, table, channels=3, target_mode=None, **kwargs):
389+
def __init__(
390+
self, size, table, channels: int = 3, target_mode: str | None = None, **kwargs
391+
):
385392
if channels not in (3, 4):
386393
msg = "Only 3 or 4 output channels are supported"
387394
raise ValueError(msg)
@@ -395,7 +402,7 @@ def __init__(self, size, table, channels=3, target_mode=None, **kwargs):
395402
items = size[0] * size[1] * size[2]
396403
wrong_size = False
397404

398-
numpy = None
405+
numpy: ModuleType | None = None
399406
if hasattr(table, "shape"):
400407
try:
401408
import numpy
@@ -442,7 +449,7 @@ def __init__(self, size, table, channels=3, target_mode=None, **kwargs):
442449
self.table = table
443450

444451
@staticmethod
445-
def _check_size(size):
452+
def _check_size(size: Any) -> list[int]:
446453
try:
447454
_, _, _ = size
448455
except ValueError as e:

src/PIL/ImageMorph.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def __init__(
200200
elif patterns is not None:
201201
self.lut = LutBuilder(patterns=patterns).build_lut()
202202

203-
def apply(self, image: Image.Image):
203+
def apply(self, image: Image.Image) -> tuple[int, Image.Image]:
204204
"""Run a single morphological operation on an image
205205
206206
Returns a tuple of the number of changed pixels and the
@@ -216,7 +216,7 @@ def apply(self, image: Image.Image):
216216
count = _imagingmorph.apply(bytes(self.lut), image.im.id, outimage.im.id)
217217
return count, outimage
218218

219-
def match(self, image: Image.Image):
219+
def match(self, image: Image.Image) -> list[tuple[int, int]]:
220220
"""Get a list of coordinates matching the morphological operation on
221221
an image.
222222
@@ -231,7 +231,7 @@ def match(self, image: Image.Image):
231231
raise ValueError(msg)
232232
return _imagingmorph.match(bytes(self.lut), image.im.id)
233233

234-
def get_on_pixels(self, image: Image.Image):
234+
def get_on_pixels(self, image: Image.Image) -> list[tuple[int, int]]:
235235
"""Get a list of all turned on pixels in a binary image
236236
237237
Returns a list of tuples of (x,y) coordinates

src/PIL/Jpeg2KImagePlugin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def __init__(self, fp, length=-1):
3434
self.length = length
3535
self.remaining_in_box = -1
3636

37-
def _can_read(self, num_bytes):
37+
def _can_read(self, num_bytes: int) -> bool:
3838
if self.has_length and self.fp.tell() + num_bytes > self.length:
3939
# Outside box: ensure we don't read past the known file length
4040
return False
@@ -44,7 +44,7 @@ def _can_read(self, num_bytes):
4444
else:
4545
return True # No length known, just read
4646

47-
def _read_bytes(self, num_bytes):
47+
def _read_bytes(self, num_bytes: int) -> bytes:
4848
if not self._can_read(num_bytes):
4949
msg = "Not enough data in header"
5050
raise SyntaxError(msg)
@@ -74,7 +74,7 @@ def has_next_box(self) -> bool:
7474
else:
7575
return True
7676

77-
def next_box_type(self):
77+
def next_box_type(self) -> bytes:
7878
# Skip the rest of the box if it has not been read
7979
if self.remaining_in_box > 0:
8080
self.fp.seek(self.remaining_in_box, os.SEEK_CUR)

src/PIL/PaletteFile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@ def __init__(self, fp):
4848

4949
self.palette = b"".join(self.palette)
5050

51-
def getpalette(self):
51+
def getpalette(self) -> tuple[bytes, str]:
5252
return self.palette, self.rawmode

src/PIL/QoiImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def _open(self) -> None:
3838
class QoiDecoder(ImageFile.PyDecoder):
3939
_pulls_fd = True
4040

41-
def _add_to_previous_pixels(self, value):
41+
def _add_to_previous_pixels(self, value: bytes | bytearray) -> None:
4242
self._previous_pixel = value
4343

4444
r, g, b, a = value

src/PIL/SpiderImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def loadImageSeries(filelist=None):
233233
# For saving images in Spider format
234234

235235

236-
def makeSpiderHeader(im):
236+
def makeSpiderHeader(im: Image.Image) -> list[bytes]:
237237
nsam, nrow = im.size
238238
lenbyt = nsam * 4 # There are labrec records in the header
239239
labrec = int(1024 / lenbyt)

0 commit comments

Comments
 (0)