Raise a TypeError when Image() is called

This commit is contained in:
Andrew Murray 2023-10-13 19:10:08 +11:00
parent 4ecf1df4ea
commit ae96f81450
3 changed files with 36 additions and 21 deletions

View File

@ -94,6 +94,10 @@ class TestImage:
# with pytest.raises(MemoryError): # with pytest.raises(MemoryError):
# Image.new("L", (1000000, 1000000)) # Image.new("L", (1000000, 1000000))
def test_direct(self):
with pytest.raises(TypeError):
Image.Image()
def test_repr_pretty(self): def test_repr_pretty(self):
class Pretty: class Pretty:
def text(self, text): def text(self, text):

View File

@ -481,16 +481,11 @@ class Image:
_close_exclusive_fp_after_loading = True _close_exclusive_fp_after_loading = True
def __init__(self): def __init__(self):
# FIXME: take "new" parameters / other image? msg = (
# FIXME: turn mode and size into delegating properties? "Images should not be instantiated directly. "
self.im = None "Use the module new() function instead."
self._mode = "" )
self._size = (0, 0) raise TypeError(msg)
self.palette = None
self.info = {}
self.readonly = 0
self.pyaccess = None
self._exif = None
@property @property
def width(self): def width(self):
@ -508,8 +503,24 @@ class Image:
def mode(self): def mode(self):
return self._mode return self._mode
def _prepare(self):
self.im = None
self._mode = ""
self._size = (0, 0)
self.palette = None
self.info = {}
self.readonly = 0
self.pyaccess = None
self._exif = None
@classmethod
def _init(cls):
self = cls.__new__(cls)
self._prepare()
return self
def _new(self, im): def _new(self, im):
new = Image() new = Image._init()
new.im = im new.im = im
new._mode = im.mode new._mode = im.mode
new._size = im.size new._size = im.size
@ -695,7 +706,7 @@ class Image:
return [self.info, self.mode, self.size, self.getpalette(), im_data] return [self.info, self.mode, self.size, self.getpalette(), im_data]
def __setstate__(self, state): def __setstate__(self, state):
Image.__init__(self) self._prepare()
info, mode, size, palette, data = state info, mode, size, palette, data = state
self.info = info self.info = info
self._mode = mode self._mode = mode
@ -980,7 +991,7 @@ class Image:
else: else:
# get the new transparency color. # get the new transparency color.
# use existing conversions # use existing conversions
trns_im = Image()._new(core.new(self.mode, (1, 1))) trns_im = Image._init()._new(core.new(self.mode, (1, 1)))
if self.mode == "P": if self.mode == "P":
trns_im.putpalette(self.palette) trns_im.putpalette(self.palette)
if isinstance(t, tuple): if isinstance(t, tuple):
@ -2874,7 +2885,7 @@ class ImageTransformHandler:
def _wedge(): def _wedge():
"""Create greyscale wedge (for debugging only)""" """Create greyscale wedge (for debugging only)"""
return Image()._new(core.wedge("L")) return Image._init()._new(core.wedge("L"))
def _check_size(size): def _check_size(size):
@ -2918,7 +2929,7 @@ def new(mode, size, color=0):
if color is None: if color is None:
# don't initialize # don't initialize
return Image()._new(core.new(mode, size)) return Image._init()._new(core.new(mode, size))
if isinstance(color, str): if isinstance(color, str):
# css3-style specifier # css3-style specifier
@ -2927,7 +2938,7 @@ def new(mode, size, color=0):
color = ImageColor.getcolor(color, mode) color = ImageColor.getcolor(color, mode)
im = Image() im = Image._init()
if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]: if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]:
# RGB or RGBA value for a P image # RGB or RGBA value for a P image
from . import ImagePalette from . import ImagePalette
@ -3547,7 +3558,7 @@ def effect_mandelbrot(size, extent, quality):
(x0, y0, x1, y1). (x0, y0, x1, y1).
:param quality: Quality. :param quality: Quality.
""" """
return Image()._new(core.effect_mandelbrot(size, extent, quality)) return Image._init()._new(core.effect_mandelbrot(size, extent, quality))
def effect_noise(size, sigma): def effect_noise(size, sigma):
@ -3558,7 +3569,7 @@ def effect_noise(size, sigma):
(width, height). (width, height).
:param sigma: Standard deviation of noise. :param sigma: Standard deviation of noise.
""" """
return Image()._new(core.effect_noise(size, sigma)) return Image._init()._new(core.effect_noise(size, sigma))
def linear_gradient(mode): def linear_gradient(mode):
@ -3567,7 +3578,7 @@ def linear_gradient(mode):
:param mode: Input mode. :param mode: Input mode.
""" """
return Image()._new(core.linear_gradient(mode)) return Image._init()._new(core.linear_gradient(mode))
def radial_gradient(mode): def radial_gradient(mode):
@ -3576,7 +3587,7 @@ def radial_gradient(mode):
:param mode: Input mode. :param mode: Input mode.
""" """
return Image()._new(core.radial_gradient(mode)) return Image._init()._new(core.radial_gradient(mode))
# -------------------------------------------------------------------- # --------------------------------------------------------------------

View File

@ -86,7 +86,7 @@ class ImageFile(Image.Image):
"""Base class for image file format handlers.""" """Base class for image file format handlers."""
def __init__(self, fp=None, filename=None): def __init__(self, fp=None, filename=None):
super().__init__() super()._prepare()
self._min_frame = 0 self._min_frame = 0