Skip to content

Commit 60c94e6

Browse files
authored
Merge pull request #8055 from radarhere/type_hint
2 parents e39ee95 + a8d1548 commit 60c94e6

13 files changed

+51
-44
lines changed

src/PIL/FliImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def seek(self, frame: int) -> None:
132132
for f in range(self.__frame + 1, frame + 1):
133133
self._seek(f)
134134

135-
def _seek(self, frame):
135+
def _seek(self, frame: int) -> None:
136136
if frame == 0:
137137
self.__frame = -1
138138
self._fp.seek(self.__rewind)

src/PIL/GifImagePlugin.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def data(self) -> bytes | None:
8282
return self.fp.read(s[0])
8383
return None
8484

85-
def _is_palette_needed(self, p):
85+
def _is_palette_needed(self, p: bytes) -> bool:
8686
for i in range(0, len(p), 3):
8787
if not (i // 3 == p[i] == p[i + 1] == p[i + 2]):
8888
return True
@@ -474,7 +474,7 @@ def tell(self) -> int:
474474
RAWMODE = {"1": "L", "L": "L", "P": "P"}
475475

476476

477-
def _normalize_mode(im):
477+
def _normalize_mode(im: Image.Image) -> Image.Image:
478478
"""
479479
Takes an image (or frame), returns an image in a mode that is appropriate
480480
for saving in a Gif.
@@ -887,7 +887,7 @@ def _get_optimize(im, info):
887887
return used_palette_colors
888888

889889

890-
def _get_color_table_size(palette_bytes):
890+
def _get_color_table_size(palette_bytes: bytes) -> int:
891891
# calculate the palette size for the header
892892
if not palette_bytes:
893893
return 0
@@ -897,7 +897,7 @@ def _get_color_table_size(palette_bytes):
897897
return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1
898898

899899

900-
def _get_header_palette(palette_bytes):
900+
def _get_header_palette(palette_bytes: bytes) -> bytes:
901901
"""
902902
Returns the palette, null padded to the next power of 2 (*3) bytes
903903
suitable for direct inclusion in the GIF header
@@ -915,7 +915,7 @@ def _get_header_palette(palette_bytes):
915915
return palette_bytes
916916

917917

918-
def _get_palette_bytes(im):
918+
def _get_palette_bytes(im: Image.Image) -> bytes:
919919
"""
920920
Gets the palette for inclusion in the gif header
921921

src/PIL/GimpPaletteFile.py

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

5454
self.palette = b"".join(self.palette)
5555

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

src/PIL/ImImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,11 @@ def _open(self) -> None:
271271
self.tile = [("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1))]
272272

273273
@property
274-
def n_frames(self):
274+
def n_frames(self) -> int:
275275
return self.info[FRAMES]
276276

277277
@property
278-
def is_animated(self):
278+
def is_animated(self) -> bool:
279279
return self.info[FRAMES] > 1
280280

281281
def seek(self, frame: int) -> None:

src/PIL/ImageDraw.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import math
3535
import numbers
3636
import struct
37-
from typing import Sequence, cast
37+
from typing import TYPE_CHECKING, Sequence, cast
3838

3939
from . import Image, ImageColor
4040
from ._typing import Coords
@@ -92,7 +92,10 @@ def __init__(self, im: Image.Image, mode: str | None = None) -> None:
9292
self.fontmode = "L" # aliasing is okay for other modes
9393
self.fill = False
9494

95-
def getfont(self):
95+
if TYPE_CHECKING:
96+
from . import ImageFont
97+
98+
def getfont(self) -> ImageFont.FreeTypeFont | ImageFont.ImageFont:
9699
"""
97100
Get the current default font.
98101

src/PIL/ImageFilter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ def transform(self, callback, with_normals=False, channels=None, target_mode=Non
544544
_copy_table=False,
545545
)
546546

547-
def __repr__(self):
547+
def __repr__(self) -> str:
548548
r = [
549549
f"{self.__class__.__name__} from {self.table.__class__.__name__}",
550550
"size={:d}x{:d}x{:d}".format(*self.size),

src/PIL/ImagePalette.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def colors(self):
6666
def colors(self, colors):
6767
self._colors = colors
6868

69-
def copy(self):
69+
def copy(self) -> ImagePalette:
7070
new = ImagePalette()
7171

7272
new.mode = self.mode
@@ -77,7 +77,7 @@ def copy(self):
7777

7878
return new
7979

80-
def getdata(self):
80+
def getdata(self) -> tuple[str, bytes]:
8181
"""
8282
Get palette contents in format suitable for the low-level
8383
``im.putpalette`` primitive.
@@ -88,7 +88,7 @@ def getdata(self):
8888
return self.rawmode, self.palette
8989
return self.mode, self.tobytes()
9090

91-
def tobytes(self):
91+
def tobytes(self) -> bytes:
9292
"""Convert palette to bytes.
9393
9494
.. warning:: This method is experimental.

src/PIL/ImageTk.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def __del__(self) -> None:
136136
except Exception:
137137
pass # ignore internal errors
138138

139-
def __str__(self):
139+
def __str__(self) -> str:
140140
"""
141141
Get the Tkinter photo image identifier. This method is automatically
142142
called by Tkinter whenever a PhotoImage object is passed to a Tkinter
@@ -146,15 +146,15 @@ def __str__(self):
146146
"""
147147
return str(self.__photo)
148148

149-
def width(self):
149+
def width(self) -> int:
150150
"""
151151
Get the width of the image.
152152
153153
:return: The width, in pixels.
154154
"""
155155
return self.__size[0]
156156

157-
def height(self):
157+
def height(self) -> int:
158158
"""
159159
Get the height of the image.
160160
@@ -227,23 +227,23 @@ def __del__(self) -> None:
227227
except Exception:
228228
pass # ignore internal errors
229229

230-
def width(self):
230+
def width(self) -> int:
231231
"""
232232
Get the width of the image.
233233
234234
:return: The width, in pixels.
235235
"""
236236
return self.__size[0]
237237

238-
def height(self):
238+
def height(self) -> int:
239239
"""
240240
Get the height of the image.
241241
242242
:return: The height, in pixels.
243243
"""
244244
return self.__size[1]
245245

246-
def __str__(self):
246+
def __str__(self) -> str:
247247
"""
248248
Get the Tkinter bitmap image identifier. This method is automatically
249249
called by Tkinter whenever a BitmapImage object is passed to a Tkinter

src/PIL/Jpeg2KImagePlugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ def read_fields(self, field_format):
6363
data = self._read_bytes(size)
6464
return struct.unpack(field_format, data)
6565

66-
def read_boxes(self):
66+
def read_boxes(self) -> BoxReader:
6767
size = self.remaining_in_box
6868
data = self._read_bytes(size)
6969
return BoxReader(io.BytesIO(data), size)
7070

71-
def has_next_box(self):
71+
def has_next_box(self) -> bool:
7272
if self.has_length:
7373
return self.fp.tell() + self.remaining_in_box < self.length
7474
else:

src/PIL/PdfParser.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ class IndirectReferenceTuple(NamedTuple):
8787

8888

8989
class IndirectReference(IndirectReferenceTuple):
90-
def __str__(self):
90+
def __str__(self) -> str:
9191
return f"{self.object_id} {self.generation} R"
9292

93-
def __bytes__(self):
93+
def __bytes__(self) -> bytes:
9494
return self.__str__().encode("us-ascii")
9595

9696
def __eq__(self, other):
@@ -108,7 +108,7 @@ def __hash__(self):
108108

109109

110110
class IndirectObjectDef(IndirectReference):
111-
def __str__(self):
111+
def __str__(self) -> str:
112112
return f"{self.object_id} {self.generation} obj"
113113

114114

@@ -150,7 +150,7 @@ def __delitem__(self, key):
150150
def __contains__(self, key):
151151
return key in self.existing_entries or key in self.new_entries
152152

153-
def __len__(self):
153+
def __len__(self) -> int:
154154
return len(
155155
set(self.existing_entries.keys())
156156
| set(self.new_entries.keys())
@@ -211,7 +211,7 @@ def __init__(self, name):
211211
else:
212212
self.name = name.encode("us-ascii")
213213

214-
def name_as_str(self):
214+
def name_as_str(self) -> str:
215215
return self.name.decode("us-ascii")
216216

217217
def __eq__(self, other):
@@ -222,7 +222,7 @@ def __eq__(self, other):
222222
def __hash__(self):
223223
return hash(self.name)
224224

225-
def __repr__(self):
225+
def __repr__(self) -> str:
226226
return f"{self.__class__.__name__}({repr(self.name)})"
227227

228228
@classmethod
@@ -231,7 +231,7 @@ def from_pdf_stream(cls, data):
231231

232232
allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"}
233233

234-
def __bytes__(self):
234+
def __bytes__(self) -> bytes:
235235
result = bytearray(b"/")
236236
for b in self.name:
237237
if b in self.allowed_chars:
@@ -242,7 +242,7 @@ def __bytes__(self):
242242

243243

244244
class PdfArray(List[Any]):
245-
def __bytes__(self):
245+
def __bytes__(self) -> bytes:
246246
return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]"
247247

248248

@@ -286,7 +286,7 @@ def __getattr__(self, key):
286286
value = time.gmtime(calendar.timegm(value) + offset)
287287
return value
288288

289-
def __bytes__(self):
289+
def __bytes__(self) -> bytes:
290290
out = bytearray(b"<<")
291291
for key, value in self.items():
292292
if value is None:
@@ -304,7 +304,7 @@ class PdfBinary:
304304
def __init__(self, data):
305305
self.data = data
306306

307-
def __bytes__(self):
307+
def __bytes__(self) -> bytes:
308308
return b"<%s>" % b"".join(b"%02X" % b for b in self.data)
309309

310310

0 commit comments

Comments
 (0)