Skip to content

Commit 48e99b3

Browse files
author
its-serah
committed
Address CodeRabbit review feedback: improve raise_on_missing_reader implementation
- Fix guarding for class-based readers to respect raise_on_missing_reader flag - Add proper stacklevel and category to all warning messages for better UX - Update LoadImage docstring with Raises section and clearer documentation - Add missing warnings import to test file - Apply code formatting with black, isort, and ruff Signed-off-by: Sarah <serah.elrashidi@gmail.com>
1 parent 2f1aa2c commit 48e99b3

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

monai/transforms/io/array.py

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
from monai.data.utils import is_no_channel
4444
from monai.transforms.transform import Transform
4545
from monai.transforms.utility.array import EnsureChannelFirst
46+
from monai.utils import ImageMetaKey as Key
4647
from monai.utils import (
4748
GridSamplePadMode,
4849
ImageMetaKey,
@@ -162,11 +163,21 @@ def __init__(
162163
in the metadata (nested dictionary). default is ".", see also :py:class:`monai.transforms.DeleteItemsd`.
163164
e.g. ``prune_meta_pattern=".*_code$", prune_meta_sep=" "`` removes meta keys that ends with ``"_code"``.
164165
expanduser: if True cast filename to Path and call .expanduser on it, otherwise keep filename as is.
165-
raise_on_missing_reader: if True, raise OptionalImportError when a specified reader is not available,
166-
otherwise attempt to use fallback readers. Default is False to maintain backward compatibility.
166+
raise_on_missing_reader: if True, raise `OptionalImportError` when a specified reader is not available;
167+
otherwise attempt to use fallback readers. Defaults to False (backward compatibility).
167168
args: additional parameters for reader if providing a reader name.
168169
kwargs: additional parameters for reader if providing a reader name.
169170
171+
Raises:
172+
OptionalImportError: If `raise_on_missing_reader=True` and the specified reader
173+
cannot be found or its optional dependency is not installed.
174+
175+
Accepted reader types:
176+
- str: name of a registered reader (e.g., `"ITKReader"`)
177+
- class: e.g., `ITKReader` or a custom reader class
178+
- instance: e.g., `ITKReader(pixel_type=itk.UC)`
179+
- list/tuple: multiple reader names or classes to try in order
180+
170181
Note:
171182
172183
- The transform returns a MetaTensor, unless `set_track_meta(False)` has been used, in which case, a
@@ -218,21 +229,53 @@ def __init__(
218229
if self.raise_on_missing_reader:
219230
raise OptionalImportError(msg)
220231
else:
221-
warnings.warn(f"{msg} Will use fallback readers if available.")
232+
warnings.warn(
233+
f"{msg} Will use fallback readers if available.",
234+
category=UserWarning,
235+
stacklevel=2,
236+
)
222237
continue
223238
try:
224239
self.register(the_reader(*args, **kwargs))
225240
except OptionalImportError as e:
226-
msg = f"Required package for reader {_r} is not installed, or the version doesn't match requirement."
241+
msg = (
242+
f"Required package for reader {_r} is not installed, or the version doesn't match requirement."
243+
)
227244
if self.raise_on_missing_reader:
228245
raise OptionalImportError(msg) from e
229246
else:
230-
warnings.warn(f"{msg} Will use fallback readers if available.")
247+
warnings.warn(
248+
f"{msg} Will use fallback readers if available.",
249+
category=UserWarning,
250+
stacklevel=2,
251+
)
231252
except TypeError: # the reader doesn't have the corresponding args/kwargs
232-
warnings.warn(f"{_r} is not supported with the given parameters {args} {kwargs}.")
253+
warnings.warn(
254+
f"{_r} is not supported with the given parameters {args} {kwargs}.",
255+
category=UserWarning,
256+
stacklevel=2,
257+
)
233258
self.register(the_reader())
234259
elif inspect.isclass(_r):
235-
self.register(_r(*args, **kwargs))
260+
try:
261+
self.register(_r(*args, **kwargs))
262+
except OptionalImportError as e:
263+
msg = f"Required package for reader {_r.__name__} is not installed, or the version doesn't match requirement."
264+
if self.raise_on_missing_reader:
265+
raise OptionalImportError(msg) from e
266+
else:
267+
warnings.warn(
268+
f"{msg} Will use fallback readers if available.",
269+
category=UserWarning,
270+
stacklevel=2,
271+
)
272+
except TypeError:
273+
warnings.warn(
274+
f"{_r.__name__} is not supported with the given parameters {args} {kwargs}.",
275+
category=UserWarning,
276+
stacklevel=2,
277+
)
278+
self.register(_r())
236279
else:
237280
self.register(_r) # reader instance, ignoring the constructor args/kwargs
238281
return

tests/transforms/test_load_image.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import shutil
1616
import tempfile
1717
import unittest
18+
import warnings
1819
from pathlib import Path
1920

2021
import nibabel as nib

0 commit comments

Comments
 (0)