Skip to content

Commit 0a66b98

Browse files
authored
Merge pull request #7597 from hugovk/comprehensions
Use list comprehensions to create transformed lists
2 parents 584fdde + f7c3f2a commit 0a66b98

File tree

12 files changed

+46
-103
lines changed

12 files changed

+46
-103
lines changed

Tests/test_file_apng.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,7 @@ def test_apng_save(tmp_path):
356356
assert im.getpixel((64, 32)) == (0, 255, 0, 255)
357357

358358
with Image.open("Tests/images/apng/single_frame_default.png") as im:
359-
frames = []
360-
for frame_im in ImageSequence.Iterator(im):
361-
frames.append(frame_im.copy())
359+
frames = [frame_im.copy() for frame_im in ImageSequence.Iterator(im)]
362360
frames[0].save(
363361
test_file, save_all=True, default_image=True, append_images=frames[1:]
364362
)

src/PIL/FpxImagePlugin.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,15 @@ def _open_index(self, index=1):
9797

9898
s = prop[0x2000002 | id]
9999

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

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

111110
# load JPEG tables, if any
112111
self.jpeg = {}

src/PIL/Image.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,9 +1288,9 @@ def filter(self, filter):
12881288
if self.im.bands == 1 or multiband:
12891289
return self._new(filter.filter(self.im))
12901290

1291-
ims = []
1292-
for c in range(self.im.bands):
1293-
ims.append(self._new(filter.filter(self.im.getband(c))))
1291+
ims = [
1292+
self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands)
1293+
]
12941294
return merge(self.mode, ims)
12951295

12961296
def getbands(self):
@@ -1339,10 +1339,7 @@ def getcolors(self, maxcolors=256):
13391339
self.load()
13401340
if self.mode in ("1", "L", "P"):
13411341
h = self.im.histogram()
1342-
out = []
1343-
for i in range(256):
1344-
if h[i]:
1345-
out.append((h[i], i))
1342+
out = [(h[i], i) for i in range(256) if h[i]]
13461343
if len(out) > maxcolors:
13471344
return None
13481345
return out
@@ -1383,10 +1380,7 @@ def getextrema(self):
13831380

13841381
self.load()
13851382
if self.im.bands > 1:
1386-
extrema = []
1387-
for i in range(self.im.bands):
1388-
extrema.append(self.im.getband(i).getextrema())
1389-
return tuple(extrema)
1383+
return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands))
13901384
return self.im.getextrema()
13911385

13921386
def _getxmp(self, xmp_tags):

src/PIL/ImageCms.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -787,11 +787,8 @@ def getProfileInfo(profile):
787787
# info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint
788788
description = profile.profile.profile_description
789789
cpright = profile.profile.copyright
790-
arr = []
791-
for elt in (description, cpright):
792-
if elt:
793-
arr.append(elt)
794-
return "\r\n\r\n".join(arr) + "\r\n\r\n"
790+
elements = [element for element in (description, cpright) if element]
791+
return "\r\n\r\n".join(elements) + "\r\n\r\n"
795792

796793
except (AttributeError, OSError, TypeError, ValueError) as v:
797794
raise PyCMSError(v) from v

src/PIL/ImageOps.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -557,9 +557,7 @@ def invert(image):
557557
:param image: The image to invert.
558558
:return: An image.
559559
"""
560-
lut = []
561-
for i in range(256):
562-
lut.append(255 - i)
560+
lut = list(range(255, -1, -1))
563561
return image.point(lut) if image.mode == "1" else _lut(image, lut)
564562

565563

@@ -581,10 +579,8 @@ def posterize(image, bits):
581579
:param bits: The number of bits to keep for each channel (1-8).
582580
:return: An image.
583581
"""
584-
lut = []
585582
mask = ~(2 ** (8 - bits) - 1)
586-
for i in range(256):
587-
lut.append(i & mask)
583+
lut = [i & mask for i in range(256)]
588584
return _lut(image, lut)
589585

590586

src/PIL/ImagePalette.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -200,21 +200,15 @@ def raw(rawmode, data):
200200

201201

202202
def make_linear_lut(black, white):
203-
lut = []
204203
if black == 0:
205-
for i in range(256):
206-
lut.append(white * i // 255)
207-
else:
208-
msg = "unavailable when black is non-zero"
209-
raise NotImplementedError(msg) # FIXME
210-
return lut
204+
return [white * i // 255 for i in range(256)]
205+
206+
msg = "unavailable when black is non-zero"
207+
raise NotImplementedError(msg) # FIXME
211208

212209

213210
def make_gamma_lut(exp):
214-
lut = []
215-
for i in range(256):
216-
lut.append(int(((i / 255.0) ** exp) * 255.0 + 0.5))
217-
return lut
211+
return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)]
218212

219213

220214
def negative(mode="RGB"):
@@ -226,9 +220,7 @@ def negative(mode="RGB"):
226220
def random(mode="RGB"):
227221
from random import randint
228222

229-
palette = []
230-
for i in range(256 * len(mode)):
231-
palette.append(randint(0, 255))
223+
palette = [randint(0, 255) for _ in range(256 * len(mode))]
232224
return ImagePalette(mode, palette)
233225

234226

src/PIL/ImageQt.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,10 @@ def align8to32(bytes, width, mode):
103103
if not extra_padding:
104104
return bytes
105105

106-
new_data = []
107-
for i in range(len(bytes) // bytes_per_line):
108-
new_data.append(
109-
bytes[i * bytes_per_line : (i + 1) * bytes_per_line]
110-
+ b"\x00" * extra_padding
111-
)
106+
new_data = [
107+
bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding
108+
for i in range(len(bytes) // bytes_per_line)
109+
]
112110

113111
return b"".join(new_data)
114112

@@ -131,15 +129,11 @@ def _toqclass_helper(im):
131129
format = qt_format.Format_Mono
132130
elif im.mode == "L":
133131
format = qt_format.Format_Indexed8
134-
colortable = []
135-
for i in range(256):
136-
colortable.append(rgb(i, i, i))
132+
colortable = [rgb(i, i, i) for i in range(256)]
137133
elif im.mode == "P":
138134
format = qt_format.Format_Indexed8
139-
colortable = []
140135
palette = im.getpalette()
141-
for i in range(0, len(palette), 3):
142-
colortable.append(rgb(*palette[i : i + 3]))
136+
colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)]
143137
elif im.mode == "RGB":
144138
# Populate the 4th channel with 255
145139
im = im.convert("RGBA")

src/PIL/ImageStat.py

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,10 @@ def minmax(histogram):
5959
x = max(x, i)
6060
return n, x # returns (255, 0) if there's no data in the histogram
6161

62-
v = []
63-
for i in range(0, len(self.h), 256):
64-
v.append(minmax(self.h[i:]))
65-
return v
62+
return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)]
6663

6764
def _getcount(self):
6865
"""Get total number of pixels in each layer"""
69-
7066
return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)]
7167

7268
def _getsum(self):
@@ -93,11 +89,7 @@ def _getsum2(self):
9389

9490
def _getmean(self):
9591
"""Get average pixel level for each layer"""
96-
97-
v = []
98-
for i in self.bands:
99-
v.append(self.sum[i] / self.count[i])
100-
return v
92+
return [self.sum[i] / self.count[i] for i in self.bands]
10193

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

117109
def _getrms(self):
118110
"""Get RMS for each layer"""
119-
120-
v = []
121-
for i in self.bands:
122-
v.append(math.sqrt(self.sum2[i] / self.count[i]))
123-
return v
111+
return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands]
124112

125113
def _getvar(self):
126114
"""Get variance for each layer"""
127-
128-
v = []
129-
for i in self.bands:
130-
n = self.count[i]
131-
v.append((self.sum2[i] - (self.sum[i] ** 2.0) / n) / n)
132-
return v
115+
return [
116+
(self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i]
117+
for i in self.bands
118+
]
133119

134120
def _getstddev(self):
135121
"""Get standard deviation for each layer"""
136-
137-
v = []
138-
for i in self.bands:
139-
v.append(math.sqrt(self.var[i]))
140-
return v
122+
return [math.sqrt(self.var[i]) for i in self.bands]
141123

142124

143125
Global = Stat # compatibility

src/PIL/JpegImagePlugin.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,7 @@ def SOF(self, marker):
233233
# fixup icc profile
234234
self.icclist.sort() # sort by sequence number
235235
if self.icclist[0][13] == len(self.icclist):
236-
profile = []
237-
for p in self.icclist:
238-
profile.append(p[14:])
236+
profile = [p[14:] for p in self.icclist]
239237
icc_profile = b"".join(profile)
240238
else:
241239
icc_profile = None # wrong number of fragments

src/PIL/MicImagePlugin.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ def _open(self):
5151
# find ACI subfiles with Image members (maybe not the
5252
# best way to identify MIC files, but what the... ;-)
5353

54-
self.images = []
55-
for path in self.ole.listdir():
56-
if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image":
57-
self.images.append(path)
54+
self.images = [
55+
path
56+
for path in self.ole.listdir()
57+
if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image"
58+
]
5859

5960
# if we didn't find any images, this is probably not
6061
# an MIC file.

0 commit comments

Comments
 (0)