Skip to content

Commit 0cad346

Browse files
authored
Merge pull request #8042 from radarhere/type_hint
2 parents 8246673 + 58ee112 commit 0cad346

23 files changed

+67
-62
lines changed

src/PIL/BlpImagePlugin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ class BlpImageFile(ImageFile.ImageFile):
253253
format = "BLP"
254254
format_description = "Blizzard Mipmap Format"
255255

256-
def _open(self):
256+
def _open(self) -> None:
257257
self.magic = self.fp.read(4)
258258

259259
self.fp.seek(5, os.SEEK_CUR)
@@ -333,7 +333,7 @@ def _read_bgra(self, palette):
333333

334334

335335
class BLP1Decoder(_BLPBaseDecoder):
336-
def _load(self):
336+
def _load(self) -> None:
337337
if self._blp_compression == Format.JPEG:
338338
self._decode_jpeg_stream()
339339

@@ -418,7 +418,7 @@ def _load(self):
418418
class BLPEncoder(ImageFile.PyEncoder):
419419
_pushes_fd = True
420420

421-
def _write_palette(self):
421+
def _write_palette(self) -> bytes:
422422
data = b""
423423
palette = self.im.getpalette("RGBA", "RGBA")
424424
for i in range(len(palette) // 4):

src/PIL/BmpImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ def _bitmap(self, header=0, offset=0):
283283
)
284284
]
285285

286-
def _open(self):
286+
def _open(self) -> None:
287287
"""Open file, check magic number and read header"""
288288
# read 14 bytes: magic number, filesize, reserved, header final offset
289289
head_data = self.fp.read(14)
@@ -376,7 +376,7 @@ class DibImageFile(BmpImageFile):
376376
format = "DIB"
377377
format_description = "Windows Bitmap"
378378

379-
def _open(self):
379+
def _open(self) -> None:
380380
self._bitmap()
381381

382382

src/PIL/DcxImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@ def _open(self):
6363
self.is_animated = self.n_frames > 1
6464
self.seek(0)
6565

66-
def seek(self, frame):
66+
def seek(self, frame: int) -> None:
6767
if not self._seek_check(frame):
6868
return
6969
self.frame = frame
7070
self.fp = self._fp
7171
self.fp.seek(self._offset[frame])
7272
PcxImageFile._open(self)
7373

74-
def tell(self):
74+
def tell(self) -> int:
7575
return self.frame
7676

7777

src/PIL/DdsImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ class DdsImageFile(ImageFile.ImageFile):
331331
format = "DDS"
332332
format_description = "DirectDraw Surface"
333333

334-
def _open(self):
334+
def _open(self) -> None:
335335
if not _accept(self.fp.read(4)):
336336
msg = "not a DDS file"
337337
raise SyntaxError(msg)

src/PIL/EpsImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def seek(self, offset, whence=io.SEEK_SET):
178178
self.char = None
179179
self.fp.seek(offset, whence)
180180

181-
def readline(self):
181+
def readline(self) -> str:
182182
s = [self.char or b""]
183183
self.char = None
184184

@@ -212,7 +212,7 @@ class EpsImageFile(ImageFile.ImageFile):
212212

213213
mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"}
214214

215-
def _open(self):
215+
def _open(self) -> None:
216216
(length, offset) = self._find_offset(self.fp)
217217

218218
# go to offset - start of "%!PS"

src/PIL/FliImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def _palette(self, palette, shift):
123123
palette[i] = (r, g, b)
124124
i += 1
125125

126-
def seek(self, frame):
126+
def seek(self, frame: int) -> None:
127127
if not self._seek_check(frame):
128128
return
129129
if frame < self.__frame:
@@ -162,7 +162,7 @@ def _seek(self, frame):
162162

163163
self.__offset += framesize
164164

165-
def tell(self):
165+
def tell(self) -> int:
166166
return self.__frame
167167

168168

src/PIL/GifImagePlugin.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class GifImageFile(ImageFile.ImageFile):
7676

7777
global_palette = None
7878

79-
def data(self):
79+
def data(self) -> bytes | None:
8080
s = self.fp.read(1)
8181
if s and s[0]:
8282
return self.fp.read(s[0])
@@ -88,7 +88,7 @@ def _is_palette_needed(self, p):
8888
return True
8989
return False
9090

91-
def _open(self):
91+
def _open(self) -> None:
9292
# Screen
9393
s = self.fp.read(13)
9494
if not _accept(s):
@@ -147,7 +147,7 @@ def is_animated(self):
147147
self.seek(current)
148148
return self._is_animated
149149

150-
def seek(self, frame):
150+
def seek(self, frame: int) -> None:
151151
if not self._seek_check(frame):
152152
return
153153
if frame < self.__frame:
@@ -417,7 +417,7 @@ def _rgb(color):
417417
elif k in self.info:
418418
del self.info[k]
419419

420-
def load_prepare(self):
420+
def load_prepare(self) -> None:
421421
temp_mode = "P" if self._frame_palette else "L"
422422
self._prev_im = None
423423
if self.__frame == 0:
@@ -437,7 +437,7 @@ def load_prepare(self):
437437

438438
super().load_prepare()
439439

440-
def load_end(self):
440+
def load_end(self) -> None:
441441
if self.__frame == 0:
442442
if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS:
443443
if self._frame_transparency is not None:
@@ -463,7 +463,7 @@ def load_end(self):
463463
else:
464464
self.im.paste(frame_im, self.dispose_extent)
465465

466-
def tell(self):
466+
def tell(self) -> int:
467467
return self.__frame
468468

469469

src/PIL/Hdf5StubImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class HDF5StubImageFile(ImageFile.StubImageFile):
3737
format = "HDF5"
3838
format_description = "HDF5"
3939

40-
def _open(self):
40+
def _open(self) -> None:
4141
offset = self.fp.tell()
4242

4343
if not _accept(self.fp.read(8)):

src/PIL/IcnsImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class IcnsImageFile(ImageFile.ImageFile):
252252
format = "ICNS"
253253
format_description = "Mac OS icns resource"
254254

255-
def _open(self):
255+
def _open(self) -> None:
256256
self.icns = IcnsFile(self.fp)
257257
self._mode = "RGBA"
258258
self.info["sizes"] = self.icns.itersizes()

src/PIL/IcoImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ class IcoImageFile(ImageFile.ImageFile):
302302
format = "ICO"
303303
format_description = "Windows Icon"
304304

305-
def _open(self):
305+
def _open(self) -> None:
306306
self.ico = IcoFile(self.fp)
307307
self.info["sizes"] = self.ico.sizes()
308308
self.size = self.ico.entry[0]["dim"]

src/PIL/ImImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ def n_frames(self):
278278
def is_animated(self):
279279
return self.info[FRAMES] > 1
280280

281-
def seek(self, frame):
281+
def seek(self, frame: int) -> None:
282282
if not self._seek_check(frame):
283283
return
284284

@@ -296,7 +296,7 @@ def seek(self, frame):
296296

297297
self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))]
298298

299-
def tell(self):
299+
def tell(self) -> int:
300300
return self.frame
301301

302302

src/PIL/Image.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,7 +1298,10 @@ def _expand(self, xmargin: int, ymargin: int | None = None) -> Image:
12981298
self.load()
12991299
return self._new(self.im.expand(xmargin, ymargin))
13001300

1301-
def filter(self, filter):
1301+
if TYPE_CHECKING:
1302+
from . import ImageFilter
1303+
1304+
def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image:
13021305
"""
13031306
Filters this image using the given filter. For a list of
13041307
available filters, see the :py:mod:`~PIL.ImageFilter` module.
@@ -1310,7 +1313,7 @@ def filter(self, filter):
13101313

13111314
self.load()
13121315

1313-
if isinstance(filter, Callable):
1316+
if callable(filter):
13141317
filter = filter()
13151318
if not hasattr(filter, "filter"):
13161319
msg = "filter argument should be ImageFilter.Filter instance or class"

src/PIL/ImageFile.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,15 +311,15 @@ def load(self):
311311

312312
return Image.Image.load(self)
313313

314-
def load_prepare(self):
314+
def load_prepare(self) -> None:
315315
# create image memory if necessary
316316
if not self.im or self.im.mode != self.mode or self.im.size != self.size:
317317
self.im = Image.core.new(self.mode, self.size)
318318
# create palette (optional)
319319
if self.mode == "P":
320320
Image.Image.load(self)
321321

322-
def load_end(self):
322+
def load_end(self) -> None:
323323
# may be overridden
324324
pass
325325

@@ -390,7 +390,7 @@ class Parser:
390390
offset = 0
391391
finished = 0
392392

393-
def reset(self):
393+
def reset(self) -> None:
394394
"""
395395
(Consumer) Reset the parser. Note that you can only call this
396396
method immediately after you've created a parser; parser
@@ -605,7 +605,7 @@ def _safe_read(fp, size):
605605

606606

607607
class PyCodecState:
608-
def __init__(self):
608+
def __init__(self) -> None:
609609
self.xsize = 0
610610
self.ysize = 0
611611
self.xoff = 0
@@ -634,7 +634,7 @@ def init(self, args):
634634
"""
635635
self.args = args
636636

637-
def cleanup(self):
637+
def cleanup(self) -> None:
638638
"""
639639
Override to perform codec specific cleanup
640640

src/PIL/ImageFilter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
#
1717
from __future__ import annotations
1818

19+
import abc
1920
import functools
2021

2122

2223
class Filter:
23-
pass
24+
@abc.abstractmethod
25+
def filter(self, image):
26+
pass
2427

2528

2629
class MultibandFilter(Filter):

src/PIL/ImageWin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def ui_handle_clear(self, dc, x0, y0, x1, y1):
204204
def ui_handle_damage(self, x0, y0, x1, y1):
205205
pass
206206

207-
def ui_handle_destroy(self):
207+
def ui_handle_destroy(self) -> None:
208208
pass
209209

210210
def ui_handle_repair(self, dc, x0, y0, x1, y1):
@@ -213,7 +213,7 @@ def ui_handle_repair(self, dc, x0, y0, x1, y1):
213213
def ui_handle_resize(self, width, height):
214214
pass
215215

216-
def mainloop(self):
216+
def mainloop(self) -> None:
217217
Image.core.eventloop()
218218

219219

src/PIL/MicImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class MicImageFile(TiffImagePlugin.TiffImageFile):
3838
format_description = "Microsoft Image Composer"
3939
_close_exclusive_fp_after_loading = False
4040

41-
def _open(self):
41+
def _open(self) -> None:
4242
# read the OLE directory and see if this is a likely
4343
# to be a Microsoft Image Composer file
4444

@@ -88,7 +88,7 @@ def seek(self, frame):
8888
def tell(self):
8989
return self.frame
9090

91-
def close(self):
91+
def close(self) -> None:
9292
self.__fp.close()
9393
self.ole.close()
9494
super().close()

src/PIL/MpoImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def _after_jpeg_open(self, mpheader=None):
127127
def load_seek(self, pos):
128128
self._fp.seek(pos)
129129

130-
def seek(self, frame):
130+
def seek(self, frame: int) -> None:
131131
if not self._seek_check(frame):
132132
return
133133
self.fp = self._fp
@@ -149,7 +149,7 @@ def seek(self, frame):
149149
self.tile = [("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1])]
150150
self.__frame = frame
151151

152-
def tell(self):
152+
def tell(self) -> int:
153153
return self.__frame
154154

155155
@staticmethod

src/PIL/PngImagePlugin.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ def verify(self) -> None:
800800
self.fp.close()
801801
self.fp = None
802802

803-
def seek(self, frame):
803+
def seek(self, frame: int) -> None:
804804
if not self._seek_check(frame):
805805
return
806806
if frame < self.__frame:
@@ -909,10 +909,10 @@ def _seek(self, frame, rewind=False):
909909
else:
910910
self.dispose = None
911911

912-
def tell(self):
912+
def tell(self) -> int:
913913
return self.__frame
914914

915-
def load_prepare(self):
915+
def load_prepare(self) -> None:
916916
"""internal: prepare to read PNG file"""
917917

918918
if self.info.get("interlace"):
@@ -954,7 +954,7 @@ def load_read(self, read_bytes):
954954

955955
return self.fp.read(read_bytes)
956956

957-
def load_end(self):
957+
def load_end(self) -> None:
958958
"""internal: finished reading image data"""
959959
if self.__idat != 0:
960960
self.fp.read(self.__idat)

0 commit comments

Comments
 (0)