Skip to content

Commit

Permalink
Merge pull request #8107 from radarhere/type_hint
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Jun 5, 2024
2 parents ca1caad + b3c534c commit 6dbedc5
Show file tree
Hide file tree
Showing 13 changed files with 52 additions and 35 deletions.
9 changes: 6 additions & 3 deletions src/PIL/BmpImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from __future__ import annotations

import os
from typing import IO

from . import Image, ImageFile, ImagePalette
from ._binary import i16le as i16
Expand Down Expand Up @@ -52,7 +53,7 @@ def _accept(prefix: bytes) -> bool:
return prefix[:2] == b"BM"


def _dib_accept(prefix):
def _dib_accept(prefix: bytes) -> bool:
return i32(prefix) in [12, 40, 52, 56, 64, 108, 124]


Expand Down Expand Up @@ -394,11 +395,13 @@ def _open(self) -> None:
}


def _dib_save(im, fp, filename):
def _dib_save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
_save(im, fp, filename, False)


def _save(im, fp, filename, bitmap_header=True):
def _save(
im: Image.Image, fp: IO[bytes], filename: str, bitmap_header: bool = True
) -> None:
try:
rawmode, bits, colors = SAVE[im.mode]
except KeyError as e:
Expand Down
4 changes: 3 additions & 1 deletion src/PIL/BufrStubImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#
from __future__ import annotations

from typing import IO

from . import Image, ImageFile

_handler = None
Expand Down Expand Up @@ -58,7 +60,7 @@ def _load(self) -> ImageFile.StubHandler | None:
return _handler


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if _handler is None or not hasattr(_handler, "save"):
msg = "BUFR save handler not installed"
raise OSError(msg)
Expand Down
3 changes: 2 additions & 1 deletion src/PIL/DdsImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import struct
import sys
from enum import IntEnum, IntFlag
from typing import IO

from . import Image, ImageFile, ImagePalette
from ._binary import i32le as i32
Expand Down Expand Up @@ -510,7 +511,7 @@ def decode(self, buffer):
return -1, 0


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if im.mode not in ("RGB", "RGBA", "L", "LA"):
msg = f"cannot write mode {im.mode} as DDS"
raise OSError(msg)
Expand Down
16 changes: 9 additions & 7 deletions src/PIL/GifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import subprocess
from enum import IntEnum
from functools import cached_property
from typing import IO

from . import (
Image,
Expand Down Expand Up @@ -336,14 +337,13 @@ def _seek(self, frame, update_image=True):
self._mode = "RGB"
self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG)

def _rgb(color):
def _rgb(color: int) -> tuple[int, int, int]:
if self._frame_palette:
if color * 3 + 3 > len(self._frame_palette.palette):
color = 0
color = tuple(self._frame_palette.palette[color * 3 : color * 3 + 3])
return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3])
else:
color = (color, color, color)
return color
return (color, color, color)

self.dispose_extent = frame_dispose_extent
try:
Expand Down Expand Up @@ -709,11 +709,13 @@ def _write_multiple_frames(im, fp, palette):
return True


def _save_all(im, fp, filename):
def _save_all(im: Image.Image, fp: IO[bytes], filename: str) -> None:
_save(im, fp, filename, save_all=True)


def _save(im, fp, filename, save_all=False):
def _save(
im: Image.Image, fp: IO[bytes], filename: str, save_all: bool = False
) -> None:
# header
if "palette" in im.encoderinfo or "palette" in im.info:
palette = im.encoderinfo.get("palette", im.info.get("palette"))
Expand All @@ -730,7 +732,7 @@ def _save(im, fp, filename, save_all=False):
fp.flush()


def get_interlace(im):
def get_interlace(im: Image.Image) -> int:
interlace = im.encoderinfo.get("interlace", 1)

# workaround for @PIL153
Expand Down
4 changes: 3 additions & 1 deletion src/PIL/GribStubImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#
from __future__ import annotations

from typing import IO

from . import Image, ImageFile

_handler = None
Expand Down Expand Up @@ -58,7 +60,7 @@ def _load(self) -> ImageFile.StubHandler | None:
return _handler


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if _handler is None or not hasattr(_handler, "save"):
msg = "GRIB save handler not installed"
raise OSError(msg)
Expand Down
6 changes: 4 additions & 2 deletions src/PIL/IcoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import warnings
from io import BytesIO
from math import ceil, log
from typing import IO

from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin
from ._binary import i16le as i16
Expand All @@ -39,7 +40,7 @@
_MAGIC = b"\0\0\1\0"


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
fp.write(_MAGIC) # (2+2)
bmp = im.encoderinfo.get("bitmap_format") == "bmp"
sizes = im.encoderinfo.get(
Expand Down Expand Up @@ -194,7 +195,7 @@ def getimage(self, size, bpp=False):
"""
return self.frame(self.getentryindex(size, bpp))

def frame(self, idx):
def frame(self, idx: int) -> Image.Image:
"""
Get an image from frame idx
"""
Expand All @@ -205,6 +206,7 @@ def frame(self, idx):
data = self.buf.read(8)
self.buf.seek(header["offset"])

im: Image.Image
if data[:8] == PngImagePlugin._MAGIC:
# png frame
im = PngImagePlugin.PngImageFile(self.buf)
Expand Down
5 changes: 3 additions & 2 deletions src/PIL/ImImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import os
import re
from typing import IO, Any

from . import Image, ImageFile, ImagePalette

Expand Down Expand Up @@ -103,7 +104,7 @@
split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$")


def number(s):
def number(s: Any) -> float:
try:
return int(s)
except ValueError:
Expand Down Expand Up @@ -325,7 +326,7 @@ def tell(self) -> int:
}


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
try:
image_type, rawmode = SAVE[im.mode]
except KeyError as e:
Expand Down
20 changes: 10 additions & 10 deletions src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -2875,7 +2875,7 @@ def transpose(self, method: Transpose) -> Image:
self.load()
return self._new(self.im.transpose(method))

def effect_spread(self, distance):
def effect_spread(self, distance: int) -> Image:
"""
Randomly spread pixels in an image.
Expand Down Expand Up @@ -3012,7 +3012,7 @@ def new(
return im._new(core.fill(mode, size, color))


def frombytes(mode, size, data, decoder_name="raw", *args) -> Image:
def frombytes(mode, size, data, decoder_name: str = "raw", *args) -> Image:
"""
Creates a copy of an image memory from pixel data in a buffer.
Expand Down Expand Up @@ -3051,7 +3051,7 @@ def frombytes(mode, size, data, decoder_name="raw", *args) -> Image:
return im


def frombuffer(mode, size, data, decoder_name="raw", *args) -> Image:
def frombuffer(mode: str, size, data, decoder_name: str = "raw", *args) -> Image:
"""
Creates an image memory referencing pixel data in a byte buffer.
Expand Down Expand Up @@ -3553,7 +3553,7 @@ def register_save(id: str, driver) -> None:
SAVE[id.upper()] = driver


def register_save_all(id, driver) -> None:
def register_save_all(id: str, driver) -> None:
"""
Registers an image function to save all the frames
of a multiframe format. This function should not be
Expand All @@ -3565,7 +3565,7 @@ def register_save_all(id, driver) -> None:
SAVE_ALL[id.upper()] = driver


def register_extension(id, extension) -> None:
def register_extension(id: str, extension: str) -> None:
"""
Registers an image extension. This function should not be
used in application code.
Expand All @@ -3576,7 +3576,7 @@ def register_extension(id, extension) -> None:
EXTENSION[extension.lower()] = id.upper()


def register_extensions(id, extensions) -> None:
def register_extensions(id: str, extensions: list[str]) -> None:
"""
Registers image extensions. This function should not be
used in application code.
Expand All @@ -3588,7 +3588,7 @@ def register_extensions(id, extensions) -> None:
register_extension(id, extension)


def registered_extensions():
def registered_extensions() -> dict[str, str]:
"""
Returns a dictionary containing all file extensions belonging
to registered plugins
Expand Down Expand Up @@ -3650,7 +3650,7 @@ def effect_mandelbrot(size, extent, quality):
return Image()._new(core.effect_mandelbrot(size, extent, quality))


def effect_noise(size, sigma):
def effect_noise(size: tuple[int, int], sigma: float) -> Image:
"""
Generate Gaussian noise centered around 128.
Expand All @@ -3661,7 +3661,7 @@ def effect_noise(size, sigma):
return Image()._new(core.effect_noise(size, sigma))


def linear_gradient(mode):
def linear_gradient(mode: str) -> Image:
"""
Generate 256x256 linear gradient from black to white, top to bottom.
Expand All @@ -3670,7 +3670,7 @@ def linear_gradient(mode):
return Image()._new(core.linear_gradient(mode))


def radial_gradient(mode):
def radial_gradient(mode: str) -> Image:
"""
Generate 256x256 radial gradient from black to white, centre to edge.
Expand Down
3 changes: 2 additions & 1 deletion src/PIL/MpoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import itertools
import os
import struct
from typing import IO

from . import (
Image,
Expand All @@ -32,7 +33,7 @@
from ._binary import o32le


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
JpegImagePlugin._save(im, fp, filename)


Expand Down
3 changes: 2 additions & 1 deletion src/PIL/PdfImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import math
import os
import time
from typing import IO

from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features

Expand All @@ -39,7 +40,7 @@
# 5. page contents


def _save_all(im, fp, filename):
def _save_all(im: Image.Image, fp: IO[bytes], filename: str) -> None:
_save(im, fp, filename, save_all=True)


Expand Down
6 changes: 3 additions & 3 deletions src/PIL/SpiderImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import os
import struct
import sys
from typing import TYPE_CHECKING
from typing import IO, TYPE_CHECKING

from . import Image, ImageFile

Expand Down Expand Up @@ -263,7 +263,7 @@ def makeSpiderHeader(im: Image.Image) -> list[bytes]:
return [struct.pack("f", v) for v in hdr]


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if im.mode[0] != "F":
im = im.convert("F")

Expand All @@ -279,7 +279,7 @@ def _save(im, fp, filename):
ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))])


def _save_spider(im, fp, filename):
def _save_spider(im: Image.Image, fp: IO[bytes], filename: str) -> None:
# get the filename extension and register it with Image
ext = os.path.splitext(filename)[1]
Image.register_extension(SpiderImageFile.format, ext)
Expand Down
4 changes: 2 additions & 2 deletions src/PIL/TiffImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -1995,7 +1995,7 @@ def newFrame(self) -> None:
self.finalize()
self.setup()

def __enter__(self):
def __enter__(self) -> AppendingTiffWriter:
return self

def __exit__(self, exc_type, exc_value, traceback):
Expand Down Expand Up @@ -2023,7 +2023,7 @@ def goToEnd(self) -> None:
self.f.write(bytes(pad_bytes))
self.offsetOfNewPage = self.f.tell()

def setEndian(self, endian):
def setEndian(self, endian: str) -> None:
self.endian = endian
self.longFmt = f"{self.endian}L"
self.shortFmt = f"{self.endian}H"
Expand Down
4 changes: 3 additions & 1 deletion src/PIL/WmfImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
# http://wvware.sourceforge.net/caolan/ora-wmf.html
from __future__ import annotations

from typing import IO

from . import Image, ImageFile
from ._binary import i16le as word
from ._binary import si16le as short
Expand Down Expand Up @@ -161,7 +163,7 @@ def load(self, dpi=None):
return super().load()


def _save(im, fp, filename):
def _save(im: Image.Image, fp: IO[bytes], filename: str) -> None:
if _handler is None or not hasattr(_handler, "save"):
msg = "WMF save handler not installed"
raise OSError(msg)
Expand Down

0 comments on commit 6dbedc5

Please sign in to comment.