Merge pull request #8037 from radarhere/cached_property

This commit is contained in:
Hugo van Kemenade 2024-05-24 14:19:54 +03:00 committed by GitHub
commit 3c2d36e113
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -30,6 +30,7 @@ import math
import os import os
import subprocess import subprocess
from enum import IntEnum from enum import IntEnum
from functools import cached_property
from . import ( from . import (
Image, Image,
@ -112,8 +113,7 @@ class GifImageFile(ImageFile.ImageFile):
self._fp = self.fp # FIXME: hack self._fp = self.fp # FIXME: hack
self.__rewind = self.fp.tell() self.__rewind = self.fp.tell()
self._n_frames = None self._n_frames: int | None = None
self._is_animated = None
self._seek(0) # get ready to read first frame self._seek(0) # get ready to read first frame
@property @property
@ -128,24 +128,23 @@ class GifImageFile(ImageFile.ImageFile):
self.seek(current) self.seek(current)
return self._n_frames return self._n_frames
@property @cached_property
def is_animated(self): def is_animated(self) -> bool:
if self._is_animated is None:
if self._n_frames is not None: if self._n_frames is not None:
self._is_animated = self._n_frames != 1 return self._n_frames != 1
else:
current = self.tell() current = self.tell()
if current: if current:
self._is_animated = True return True
else:
try: try:
self._seek(1, False) self._seek(1, False)
self._is_animated = True is_animated = True
except EOFError: except EOFError:
self._is_animated = False is_animated = False
self.seek(current) self.seek(current)
return self._is_animated return is_animated
def seek(self, frame: int) -> None: def seek(self, frame: int) -> None:
if not self._seek_check(frame): if not self._seek_check(frame):