Skip to content

Commit c18f542

Browse files
authored
Merge pull request #1369 from DimitriPapadopoulos/preview
STY: Apply ruff preview rules
2 parents 20595d6 + ec15839 commit c18f542

26 files changed

+58
-59
lines changed

nibabel/analyze.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ def set_zooms(self, zooms):
699699
ndim = dims[0]
700700
zooms = np.asarray(zooms)
701701
if len(zooms) != ndim:
702-
raise HeaderDataError('Expecting %d zoom values for ndim %d' % (ndim, ndim))
702+
raise HeaderDataError(f'Expecting {ndim} zoom values for ndim {ndim}')
703703
if np.any(zooms < 0):
704704
raise HeaderDataError('zooms must be positive')
705705
pixdims = hdr['pixdim']
@@ -818,11 +818,11 @@ def _chk_datatype(klass, hdr, fix=False):
818818
dtype = klass._data_type_codes.dtype[code]
819819
except KeyError:
820820
rep.problem_level = 40
821-
rep.problem_msg = 'data code %d not recognized' % code
821+
rep.problem_msg = f'data code {code} not recognized'
822822
else:
823823
if dtype.itemsize == 0:
824824
rep.problem_level = 40
825-
rep.problem_msg = 'data code %d not supported' % code
825+
rep.problem_msg = f'data code {code} not supported'
826826
else:
827827
return hdr, rep
828828
if fix:

nibabel/cifti2/cifti2_axes.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ def from_mask(cls, mask, name='other', affine=None):
373373
else:
374374
raise ValueError(
375375
'Mask should be either 1-dimensional (for surfaces) or '
376-
'3-dimensional (for volumes), not %i-dimensional' % mask.ndim
376+
f'3-dimensional (for volumes), not {mask.ndim}-dimensional'
377377
)
378378

379379
@classmethod
@@ -1519,7 +1519,6 @@ def get_element(self, index):
15191519
index = self.size + index
15201520
if index >= self.size or index < 0:
15211521
raise IndexError(
1522-
'index %i is out of range for SeriesAxis with size %i'
1523-
% (original_index, self.size)
1522+
f'index {original_index} is out of range for SeriesAxis with size {self.size}'
15241523
)
15251524
return self.start + self.step * index

nibabel/cifti2/tests/test_cifti2io_header.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def test_read_and_proxies():
7272

7373
@needs_nibabel_data('nitest-cifti2')
7474
def test_version():
75-
for i, dat in enumerate(datafiles):
75+
for dat in datafiles:
7676
img = nib.load(dat)
7777
assert Version(img.header.version) == Version('2')
7878

nibabel/cmdline/dicomfs.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def __init__(self, fno):
5151
self.direct_io = False
5252

5353
def __str__(self):
54-
return 'FileHandle(%d)' % self.fno
54+
return f'FileHandle({self.fno})'
5555

5656

5757
class DICOMFS(fuse.Fuse):
@@ -85,11 +85,11 @@ def get_paths(self):
8585
series_info += f'UID: {series.uid}\n'
8686
series_info += f'number: {series.number}\n'
8787
series_info += f'description: {series.description}\n'
88-
series_info += 'rows: %d\n' % series.rows
89-
series_info += 'columns: %d\n' % series.columns
90-
series_info += 'bits allocated: %d\n' % series.bits_allocated
91-
series_info += 'bits stored: %d\n' % series.bits_stored
92-
series_info += 'storage instances: %d\n' % len(series.storage_instances)
88+
series_info += f'rows: {series.rows}\n'
89+
series_info += f'columns: {series.columns}\n'
90+
series_info += f'bits allocated: {series.bits_allocated}\n'
91+
series_info += f'bits stored: {series.bits_stored}\n'
92+
series_info += f'storage instances: {len(series.storage_instances)}\n'
9393
d[series.number] = {
9494
'INFO': series_info.encode('ascii', 'replace'),
9595
f'{series.number}.nii': (series.nifti_size, series.as_nifti),

nibabel/cmdline/diff.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def get_data_diff(files, max_abs=0, max_rel=0, dtype=np.float64):
266266
diffs1.append({'CMP': 'incompat'})
267267

268268
if any(diffs1):
269-
diffs['DATA(diff %d:)' % (i + 1)] = diffs1
269+
diffs[f'DATA(diff {i + 1}:)'] = diffs1
270270

271271
return diffs
272272

@@ -293,7 +293,7 @@ def display_diff(files, diff):
293293
output += field_width.format('Field/File')
294294

295295
for i, f in enumerate(files, 1):
296-
output += '%d:%s' % (i, filename_width.format(os.path.basename(f)))
296+
output += f'{i}:{filename_width.format(os.path.basename(f))}'
297297

298298
output += '\n'
299299

nibabel/cmdline/ls.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def get_opt_parser():
7373
action='store_true',
7474
dest='all_counts',
7575
default=False,
76-
help='Output all counts, even if number of unique values > %d' % MAX_UNIQUE,
76+
help=f'Output all counts, even if number of unique values > {MAX_UNIQUE}',
7777
),
7878
Option(
7979
'-z',
@@ -117,7 +117,7 @@ def proc_file(f, opts):
117117
row += ['']
118118

119119
if hasattr(h, 'extensions') and len(h.extensions):
120-
row += ['@l#exts: %d' % len(h.extensions)]
120+
row += [f'@l#exts: {len(h.extensions)}']
121121
else:
122122
row += ['']
123123

@@ -166,16 +166,16 @@ def proc_file(f, opts):
166166
d = d.reshape(-1)
167167
if opts.stats:
168168
# just # of elements
169-
row += ['@l[%d]' % np.prod(d.shape)]
169+
row += [f'@l[{np.prod(d.shape)}]']
170170
# stats
171171
row += [f'@l[{np.min(d):.2g}, {np.max(d):.2g}]' if len(d) else '-']
172172
if opts.counts:
173173
items, inv = np.unique(d, return_inverse=True)
174174
if len(items) > 1000 and not opts.all_counts:
175-
counts = _err('%d uniques. Use --all-counts' % len(items))
175+
counts = _err(f'{len(items)} uniques. Use --all-counts')
176176
else:
177177
freq = np.bincount(inv)
178-
counts = ' '.join('%g:%d' % (i, f) for i, f in zip(items, freq))
178+
counts = ' '.join(f'{i:g}:{f}' for i, f in zip(items, freq))
179179
row += ['@l' + counts]
180180
except OSError as e:
181181
verbose(2, f'Failed to obtain stats/counts -- {e}')

nibabel/dft.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def as_nifti(self):
162162
for i, si in enumerate(self.storage_instances):
163163
if i + 1 != si.instance_number:
164164
raise InstanceStackError(self, i, si)
165-
logger.info('reading %d/%d' % (i + 1, len(self.storage_instances)))
165+
logger.info(f'reading {i + 1}/{len(self.storage_instances)}')
166166
d = self.storage_instances[i].dicom()
167167
data[i, :, :] = d.pixel_array
168168

nibabel/ecat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,14 +309,14 @@ def get_patient_orient(self):
309309
"""
310310
code = self._structarr['patient_orientation'].item()
311311
if code not in self._patient_orient_codes:
312-
raise KeyError('Ecat Orientation CODE %d not recognized' % code)
312+
raise KeyError(f'Ecat Orientation CODE {code} not recognized')
313313
return self._patient_orient_codes[code]
314314

315315
def get_filetype(self):
316316
"""Type of ECAT Matrix File from code stored in header"""
317317
code = self._structarr['file_type'].item()
318318
if code not in self._ft_codes:
319-
raise KeyError('Ecat Filetype CODE %d not recognized' % code)
319+
raise KeyError(f'Ecat Filetype CODE {code} not recognized')
320320
return self._ft_codes[code]
321321

322322
@classmethod

nibabel/fileslice.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def canonical_slicers(sliceobj, shape, check_inds=True):
127127
if slicer < 0:
128128
slicer = dim_len + slicer
129129
elif check_inds and slicer >= dim_len:
130-
raise ValueError('Integer index %d to large' % slicer)
130+
raise ValueError(f'Integer index {slicer} too large')
131131
can_slicers.append(slicer)
132132
# Fill out any missing dimensions
133133
if n_real < n_dim:

nibabel/freesurfer/io.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ def _read_annot_ctab_old_format(fobj, n_entries):
427427
for i in range(n_entries):
428428
# structure name length + string
429429
name_length = np.fromfile(fobj, dt, 1)[0]
430-
name = np.fromfile(fobj, '|S%d' % name_length, 1)[0]
430+
name = np.fromfile(fobj, f'|S{name_length}', 1)[0]
431431
names.append(name)
432432
# read RGBT for this entry
433433
ctab[i, :4] = np.fromfile(fobj, dt, 4)
@@ -465,13 +465,13 @@ def _read_annot_ctab_new_format(fobj, ctab_version):
465465
dt = _ANNOT_DT
466466
# This code works with a file version == 2, nothing else
467467
if ctab_version != 2:
468-
raise Exception('Unrecognised .annot file version (%i)', ctab_version)
468+
raise Exception(f'Unrecognised .annot file version ({ctab_version})')
469469
# maximum LUT index present in the file
470470
max_index = np.fromfile(fobj, dt, 1)[0]
471471
ctab = np.zeros((max_index, 5), dt)
472472
# orig_tab string length + string
473473
length = np.fromfile(fobj, dt, 1)[0]
474-
np.fromfile(fobj, '|S%d' % length, 1)[0] # Orig table path
474+
np.fromfile(fobj, f'|S{length}', 1)[0] # Orig table path
475475
# number of LUT entries present in the file
476476
entries_to_read = np.fromfile(fobj, dt, 1)[0]
477477
names = list()
@@ -480,7 +480,7 @@ def _read_annot_ctab_new_format(fobj, ctab_version):
480480
idx = np.fromfile(fobj, dt, 1)[0]
481481
# structure name length + string
482482
name_length = np.fromfile(fobj, dt, 1)[0]
483-
name = np.fromfile(fobj, '|S%d' % name_length, 1)[0]
483+
name = np.fromfile(fobj, f'|S{name_length}', 1)[0]
484484
names.append(name)
485485
# RGBT
486486
ctab[idx, :4] = np.fromfile(fobj, dt, 4)
@@ -525,7 +525,7 @@ def write(num, dtype=dt):
525525
def write_string(s):
526526
s = (s if isinstance(s, bytes) else s.encode()) + b'\x00'
527527
write(len(s))
528-
write(s, dtype='|S%d' % len(s))
528+
write(s, dtype=f'|S{len(s)}')
529529

530530
# Generate annotation values for each ctab entry
531531
if fill_ctab:

nibabel/freesurfer/mghformat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ def set_zooms(self, zooms):
281281
zooms = np.asarray(zooms)
282282
ndims = self._ndims()
283283
if len(zooms) > ndims:
284-
raise HeaderDataError('Expecting %d zoom values' % ndims)
284+
raise HeaderDataError(f'Expecting {ndims} zoom values')
285285
if np.any(zooms[:3] <= 0):
286286
raise HeaderDataError(
287287
f'Spatial (first three) zooms must be positive; got {tuple(zooms[:3])}'

nibabel/gifti/gifti.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ def _to_xml_element(self):
522522
},
523523
)
524524
for di, dn in enumerate(self.dims):
525-
data_array.attrib['Dim%d' % di] = str(dn)
525+
data_array.attrib[f'Dim{di}'] = str(dn)
526526

527527
if self.meta is not None:
528528
data_array.append(self.meta._to_xml_element())

nibabel/gifti/parse_gifti_fast.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,8 @@ def EndElementHandler(self, name):
284284
if name == 'GIFTI':
285285
if hasattr(self, 'expected_numDA') and self.expected_numDA != self.img.numDA:
286286
warnings.warn(
287-
'Actual # of data arrays does not match '
288-
'# expected: %d != %d.' % (self.expected_numDA, self.img.numDA)
287+
'Actual # of data arrays does not match # expected: '
288+
f'{self.expected_numDA} != {self.img.numDA}.'
289289
)
290290
# remove last element of the list
291291
self.fsm_state.pop()

nibabel/gifti/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ..volumeutils import Recoder
1111

1212
# Translate dtype.kind char codes to XML text output strings
13-
KIND2FMT = {'i': '%i', 'u': '%i', 'f': '%10.6f', 'c': '%10.6f', 'V': ''}
13+
KIND2FMT = {'i': '%d', 'u': '%d', 'f': '%10.6f', 'c': '%10.6f', 'V': ''}
1414

1515
array_index_order_codes = Recoder(
1616
(

nibabel/nicom/csareader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def get_vector(csa_dict, tag_name, n):
179179
if len(items) == 0:
180180
return None
181181
if len(items) != n:
182-
raise ValueError('Expecting %d vector' % n)
182+
raise ValueError(f'Expecting {n} vector')
183183
return np.array(items)
184184

185185

nibabel/nicom/dicomreaders.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def slices_to_series(wrappers):
131131
break
132132
else: # no match in current volume lists
133133
volume_lists.append([dw])
134-
print('We appear to have %d Series' % len(volume_lists))
134+
print(f'We appear to have {len(volume_lists)} Series')
135135
# second pass
136136
out_vol_lists = []
137137
for vol_list in volume_lists:
@@ -143,7 +143,7 @@ def slices_to_series(wrappers):
143143
out_vol_lists += _third_pass(vol_list)
144144
continue
145145
out_vol_lists.append(vol_list)
146-
print('We have %d volumes after second pass' % len(out_vol_lists))
146+
print(f'We have {len(out_vol_lists)} volumes after second pass')
147147
# final pass check
148148
for vol_list in out_vol_lists:
149149
zs = [s.slice_indicator for s in vol_list]

nibabel/nicom/dicomwrappers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ def applies(self, dcm_wrp) -> bool:
565565
warnings.warn(
566566
'A multi-stack file was passed without an explicit filter, just using lowest StackID'
567567
)
568-
self._selected = sorted(stack_ids)[0]
568+
self._selected = min(stack_ids)
569569
return True
570570
return False
571571

nibabel/nicom/tests/test_dicomwrappers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -991,8 +991,8 @@ def test_scale_data(self):
991991
assert_array_equal(data * 3 - 2, MFW(fake_mf)._scale_data(data))
992992
# Decimals are OK
993993
for frame in frames:
994-
frame.PixelValueTransformationSequence[0].RescaleSlope = Decimal('3')
995-
frame.PixelValueTransformationSequence[0].RescaleIntercept = Decimal('-2')
994+
frame.PixelValueTransformationSequence[0].RescaleSlope = Decimal(3)
995+
frame.PixelValueTransformationSequence[0].RescaleIntercept = Decimal(-2)
996996
assert_array_equal(data * 3 - 2, MFW(fake_mf)._scale_data(data))
997997
# A per-frame RWV scaling takes precedence over per-frame PixelValueTransformation
998998
for frame in frames:

nibabel/nifti1.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,7 +1559,7 @@ def get_intent(self, code_repr='label'):
15591559
else:
15601560
raise TypeError('repr can be "label" or "code"')
15611561
n_params = len(recoder.parameters[code]) if known_intent else 0
1562-
params = (float(hdr['intent_p%d' % (i + 1)]) for i in range(n_params))
1562+
params = (float(hdr[f'intent_p{i}']) for i in range(1, n_params + 1))
15631563
name = hdr['intent_name'].item().decode('latin-1')
15641564
return label, tuple(params), name
15651565

@@ -1632,8 +1632,8 @@ def set_intent(self, code, params=(), name='', allow_unknown=False):
16321632
hdr['intent_name'] = name
16331633
all_params = [0] * 3
16341634
all_params[: len(params)] = params[:]
1635-
for i, param in enumerate(all_params):
1636-
hdr['intent_p%d' % (i + 1)] = param
1635+
for i, param in enumerate(all_params, start=1):
1636+
hdr[f'intent_p{i}'] = param
16371637

16381638
def get_slice_duration(self):
16391639
"""Get slice duration
@@ -1911,7 +1911,7 @@ def _chk_offset(hdr, fix=False):
19111911
return hdr, rep
19121912
if magic == hdr.single_magic and offset < hdr.single_vox_offset:
19131913
rep.problem_level = 40
1914-
rep.problem_msg = 'vox offset %d too low for single file nifti1' % offset
1914+
rep.problem_msg = f'vox offset {int(offset)} too low for single file nifti1'
19151915
if fix:
19161916
hdr['vox_offset'] = hdr.single_vox_offset
19171917
rep.fix_msg = f'setting to minimum value of {hdr.single_vox_offset}'
@@ -1943,7 +1943,7 @@ def _chk_xform_code(klass, code_type, hdr, fix):
19431943
if code in recoder.value_set():
19441944
return hdr, rep
19451945
rep.problem_level = 30
1946-
rep.problem_msg = '%s %d not valid' % (code_type, code)
1946+
rep.problem_msg = f'{code_type} {code} not valid'
19471947
if fix:
19481948
hdr[code_type] = 0
19491949
rep.fix_msg = 'setting to 0'

nibabel/orientations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def ornt_transform(start_ornt, end_ornt):
124124
result[start_in_idx, :] = [end_in_idx, flip]
125125
break
126126
else:
127-
raise ValueError('Unable to find out axis %d in start_ornt' % end_out_idx)
127+
raise ValueError(f'Unable to find out axis {end_out_idx} in start_ornt')
128128
return result
129129

130130

@@ -322,7 +322,7 @@ def axcodes2ornt(axcodes, labels=None):
322322
[ 2., 1.]])
323323
"""
324324
labels = list(zip('LPI', 'RAS')) if labels is None else labels
325-
allowed_labels = sum([list(L) for L in labels], []) + [None]
325+
allowed_labels = sum(map(list, labels), [None])
326326
if len(allowed_labels) != len(set(allowed_labels)):
327327
raise ValueError(f'Duplicate labels in {allowed_labels}')
328328
if not set(axcodes).issubset(allowed_labels):

nibabel/spatialimages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def set_zooms(self, zooms: Sequence[float]) -> None:
267267
shape = self.get_data_shape()
268268
ndim = len(shape)
269269
if len(zooms) != ndim:
270-
raise HeaderDataError('Expecting %d zoom values for ndim %d' % (ndim, ndim))
270+
raise HeaderDataError(f'Expecting {ndim} zoom values for ndim {ndim}')
271271
if any(z < 0 for z in zooms):
272272
raise HeaderDataError('zooms must be positive')
273273
self._zooms = zooms

nibabel/streamlines/tests/test_array_sequence.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test_creating_arraysequence_from_list(self):
7979
# List of ndarrays.
8080
N = 5
8181
for ndim in range(1, N + 1):
82-
common_shape = tuple([SEQ_DATA['rng'].randint(1, 10) for _ in range(ndim - 1)])
82+
common_shape = tuple(SEQ_DATA['rng'].randint(1, 10) for _ in range(ndim - 1))
8383
data = generate_data(nb_arrays=5, common_shape=common_shape, rng=SEQ_DATA['rng'])
8484
check_arr_seq(ArraySequence(data), data)
8585

nibabel/tests/test_funcs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
def _as_fname(img):
2525
global _counter
26-
fname = 'img%3d.nii' % _counter
26+
fname = f'img{_counter:3d}.nii'
2727
_counter = _counter + 1
2828
save(img, fname)
2929
return fname

nibabel/tests/test_nifti1.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,12 +578,12 @@ def test_slice_times(self):
578578
with pytest.raises(HeaderDataError):
579579
# all None
580580
hdr.set_slice_times((None,) * len(times))
581-
n_mid_times = times[:]
581+
n_mid_times = times.copy()
582582
n_mid_times[3] = None
583583
with pytest.raises(HeaderDataError):
584584
# None in middle
585585
hdr.set_slice_times(n_mid_times)
586-
funny_times = times[:]
586+
funny_times = times.copy()
587587
funny_times[3] = 0.05
588588
with pytest.raises(HeaderDataError):
589589
# can't get single slice duration

0 commit comments

Comments
 (0)