Merge pull request #7912 from hugovk/hopper-lru-cache

This commit is contained in:
Hugo van Kemenade 2024-04-01 08:53:01 +03:00 committed by GitHub
commit 22376775b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -11,6 +11,7 @@ import subprocess
import sys import sys
import sysconfig import sysconfig
import tempfile import tempfile
from functools import lru_cache
from io import BytesIO from io import BytesIO
from typing import Any, Callable, Sequence from typing import Any, Callable, Sequence
@ -250,23 +251,27 @@ def tostring(im: Image.Image, string_format: str, **options: Any) -> bytes:
return out.getvalue() return out.getvalue()
def hopper(mode: str | None = None, cache: dict[str, Image.Image] = {}) -> Image.Image: def hopper(mode: str | None = None) -> Image.Image:
# Use caching to reduce reading from disk, but return a copy
# so that the cached image isn't modified by the tests
# (for fast, isolated, repeatable tests).
if mode is None: if mode is None:
# Always return fresh not-yet-loaded version of image. # Always return fresh not-yet-loaded version of image.
# Operations on not-yet-loaded images is separate class of errors # Operations on not-yet-loaded images are a separate class of errors
# what we should catch. # that we should catch.
return Image.open("Tests/images/hopper.ppm") return Image.open("Tests/images/hopper.ppm")
# Use caching to reduce reading from disk but so an original copy is
# returned each time and the cached image isn't modified by tests return _cached_hopper(mode).copy()
# (for fast, isolated, repeatable tests).
im = cache.get(mode)
if im is None: @lru_cache
if mode == "F": def _cached_hopper(mode: str) -> Image.Image:
im = hopper("L").convert(mode) if mode == "F":
else: im = hopper("L")
im = hopper().convert(mode) else:
cache[mode] = im im = hopper()
return im.copy() return im.convert(mode)
def djpeg_available() -> bool: def djpeg_available() -> bool: