Skip to content

Commit

Permalink
Merge pull request #7597 from hugovk/comprehensions
Browse files Browse the repository at this point in the history
Use list comprehensions to create transformed lists
  • Loading branch information
radarhere committed Dec 5, 2023
2 parents 584fdde + f7c3f2a commit 0a66b98
Show file tree
Hide file tree
Showing 12 changed files with 46 additions and 103 deletions.
4 changes: 1 addition & 3 deletions Tests/test_file_apng.py
Expand Up @@ -356,9 +356,7 @@ def test_apng_save(tmp_path):
assert im.getpixel((64, 32)) == (0, 255, 0, 255)

with Image.open("Tests/images/apng/single_frame_default.png") as im:
frames = []
for frame_im in ImageSequence.Iterator(im):
frames.append(frame_im.copy())
frames = [frame_im.copy() for frame_im in ImageSequence.Iterator(im)]
frames[0].save(
test_file, save_all=True, default_image=True, append_images=frames[1:]
)
Expand Down
9 changes: 4 additions & 5 deletions src/PIL/FpxImagePlugin.py
Expand Up @@ -97,16 +97,15 @@ def _open_index(self, index=1):

s = prop[0x2000002 | id]

colors = []
bands = i32(s, 4)
if bands > 4:
msg = "Invalid number of bands"
raise OSError(msg)
for i in range(bands):
# note: for now, we ignore the "uncalibrated" flag
colors.append(i32(s, 8 + i * 4) & 0x7FFFFFFF)

self._mode, self.rawmode = MODES[tuple(colors)]
# note: for now, we ignore the "uncalibrated" flag
colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands))

self._mode, self.rawmode = MODES[colors]

# load JPEG tables, if any
self.jpeg = {}
Expand Down
16 changes: 5 additions & 11 deletions src/PIL/Image.py
Expand Up @@ -1288,9 +1288,9 @@ def filter(self, filter):
if self.im.bands == 1 or multiband:
return self._new(filter.filter(self.im))

ims = []
for c in range(self.im.bands):
ims.append(self._new(filter.filter(self.im.getband(c))))
ims = [
self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands)
]
return merge(self.mode, ims)

def getbands(self):
Expand Down Expand Up @@ -1339,10 +1339,7 @@ def getcolors(self, maxcolors=256):
self.load()
if self.mode in ("1", "L", "P"):
h = self.im.histogram()
out = []
for i in range(256):
if h[i]:
out.append((h[i], i))
out = [(h[i], i) for i in range(256) if h[i]]
if len(out) > maxcolors:
return None
return out
Expand Down Expand Up @@ -1383,10 +1380,7 @@ def getextrema(self):

self.load()
if self.im.bands > 1:
extrema = []
for i in range(self.im.bands):
extrema.append(self.im.getband(i).getextrema())
return tuple(extrema)
return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands))
return self.im.getextrema()

def _getxmp(self, xmp_tags):
Expand Down
7 changes: 2 additions & 5 deletions src/PIL/ImageCms.py
Expand Up @@ -787,11 +787,8 @@ def getProfileInfo(profile):
# info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint
description = profile.profile.profile_description
cpright = profile.profile.copyright
arr = []
for elt in (description, cpright):
if elt:
arr.append(elt)
return "\r\n\r\n".join(arr) + "\r\n\r\n"
elements = [element for element in (description, cpright) if element]
return "\r\n\r\n".join(elements) + "\r\n\r\n"

except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) from v
Expand Down
8 changes: 2 additions & 6 deletions src/PIL/ImageOps.py
Expand Up @@ -557,9 +557,7 @@ def invert(image):
:param image: The image to invert.
:return: An image.
"""
lut = []
for i in range(256):
lut.append(255 - i)
lut = list(range(255, -1, -1))
return image.point(lut) if image.mode == "1" else _lut(image, lut)


Expand All @@ -581,10 +579,8 @@ def posterize(image, bits):
:param bits: The number of bits to keep for each channel (1-8).
:return: An image.
"""
lut = []
mask = ~(2 ** (8 - bits) - 1)
for i in range(256):
lut.append(i & mask)
lut = [i & mask for i in range(256)]
return _lut(image, lut)


Expand Down
20 changes: 6 additions & 14 deletions src/PIL/ImagePalette.py
Expand Up @@ -200,21 +200,15 @@ def raw(rawmode, data):


def make_linear_lut(black, white):
lut = []
if black == 0:
for i in range(256):
lut.append(white * i // 255)
else:
msg = "unavailable when black is non-zero"
raise NotImplementedError(msg) # FIXME
return lut
return [white * i // 255 for i in range(256)]

msg = "unavailable when black is non-zero"
raise NotImplementedError(msg) # FIXME


def make_gamma_lut(exp):
lut = []
for i in range(256):
lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5))
return lut
return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)]


def negative(mode="RGB"):
Expand All @@ -226,9 +220,7 @@ def negative(mode="RGB"):
def random(mode="RGB"):
from random import randint

palette = []
for i in range(256 * len(mode)):
palette.append(randint(0, 255))
palette = [randint(0, 255) for _ in range(256 * len(mode))]
return ImagePalette(mode, palette)


Expand Down
18 changes: 6 additions & 12 deletions src/PIL/ImageQt.py
Expand Up @@ -103,12 +103,10 @@ def align8to32(bytes, width, mode):
if not extra_padding:
return bytes

new_data = []
for i in range(len(bytes) // bytes_per_line):
new_data.append(
bytes[i * bytes_per_line : (i + 1) * bytes_per_line]
+ b"\x00" * extra_padding
)
new_data = [
bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding
for i in range(len(bytes) // bytes_per_line)
]

return b"".join(new_data)

Expand All @@ -131,15 +129,11 @@ def _toqclass_helper(im):
format = qt_format.Format_Mono
elif im.mode == "L":
format = qt_format.Format_Indexed8
colortable = []
for i in range(256):
colortable.append(rgb(i, i, i))
colortable = [rgb(i, i, i) for i in range(256)]
elif im.mode == "P":
format = qt_format.Format_Indexed8
colortable = []
palette = im.getpalette()
for i in range(0, len(palette), 3):
colortable.append(rgb(*palette[i : i + 3]))
colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)]
elif im.mode == "RGB":
# Populate the 4th channel with 255
im = im.convert("RGBA")
Expand Down
34 changes: 8 additions & 26 deletions src/PIL/ImageStat.py
Expand Up @@ -59,14 +59,10 @@ def minmax(histogram):
x = max(x, i)
return n, x # returns (255, 0) if there's no data in the histogram

v = []
for i in range(0, len(self.h), 256):
v.append(minmax(self.h[i:]))
return v
return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)]

def _getcount(self):
"""Get total number of pixels in each layer"""

return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)]

def _getsum(self):
Expand All @@ -93,11 +89,7 @@ def _getsum2(self):

def _getmean(self):
"""Get average pixel level for each layer"""

v = []
for i in self.bands:
v.append(self.sum[i] / self.count[i])
return v
return [self.sum[i] / self.count[i] for i in self.bands]

def _getmedian(self):
"""Get median pixel level for each layer"""
Expand All @@ -116,28 +108,18 @@ def _getmedian(self):

def _getrms(self):
"""Get RMS for each layer"""

v = []
for i in self.bands:
v.append(math.sqrt(self.sum2[i] / self.count[i]))
return v
return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands]

def _getvar(self):
"""Get variance for each layer"""

v = []
for i in self.bands:
n = self.count[i]
v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n)
return v
return [
(self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i]
for i in self.bands
]

def _getstddev(self):
"""Get standard deviation for each layer"""

v = []
for i in self.bands:
v.append(math.sqrt(self.var[i]))
return v
return [math.sqrt(self.var[i]) for i in self.bands]


Global = Stat # compatibility
4 changes: 1 addition & 3 deletions src/PIL/JpegImagePlugin.py
Expand Up @@ -233,9 +233,7 @@ def SOF(self, marker):
# fixup icc profile
self.icclist.sort() # sort by sequence number
if self.icclist[0][13] == len(self.icclist):
profile = []
for p in self.icclist:
profile.append(p[14:])
profile = [p[14:] for p in self.icclist]
icc_profile = b"".join(profile)
else:
icc_profile = None # wrong number of fragments
Expand Down
9 changes: 5 additions & 4 deletions src/PIL/MicImagePlugin.py
Expand Up @@ -51,10 +51,11 @@ def _open(self):
# find ACI subfiles with Image members (maybe not the
# best way to identify MIC files, but what the... ;-)

self.images = []
for path in self.ole.listdir():
if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image":
self.images.append(path)
self.images = [
path
for path in self.ole.listdir()
if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image"
]

# if we didn't find any images, this is probably not
# an MIC file.
Expand Down
16 changes: 5 additions & 11 deletions src/PIL/PcfFontFile.py
Expand Up @@ -129,9 +129,8 @@ def _load_properties(self):
nprops = i32(fp.read(4))

# read property description
p = []
for i in range(nprops):
p.append((i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))))
p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)]

if nprops & 3:
fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad

Expand Down Expand Up @@ -186,8 +185,6 @@ def _load_bitmaps(self, metrics):
#
# bitmap data

bitmaps = []

fp, format, i16, i32 = self._getformat(PCF_BITMAPS)

nbitmaps = i32(fp.read(4))
Expand All @@ -196,13 +193,9 @@ def _load_bitmaps(self, metrics):
msg = "Wrong number of bitmaps"
raise OSError(msg)

offsets = []
for i in range(nbitmaps):
offsets.append(i32(fp.read(4)))
offsets = [i32(fp.read(4)) for _ in range(nbitmaps)]

bitmap_sizes = []
for i in range(4):
bitmap_sizes.append(i32(fp.read(4)))
bitmap_sizes = [i32(fp.read(4)) for _ in range(4)]

# byteorder = format & 4 # non-zero => MSB
bitorder = format & 8 # non-zero => MSB
Expand All @@ -218,6 +211,7 @@ def _load_bitmaps(self, metrics):
if bitorder:
mode = "1"

bitmaps = []
for i in range(nbitmaps):
xsize, ysize = metrics[i][:2]
b, e = offsets[i : i + 2]
Expand Down
4 changes: 1 addition & 3 deletions src/PIL/SpiderImagePlugin.py
Expand Up @@ -238,9 +238,7 @@ def makeSpiderHeader(im):
if nvalues < 23:
return []

hdr = []
for i in range(nvalues):
hdr.append(0.0)
hdr = [0.0] * nvalues

# NB these are Fortran indices
hdr[1] = 1.0 # nslice (=1 for an image)
Expand Down

0 comments on commit 0a66b98

Please sign in to comment.