|
43 | 43 | from monai.data.utils import is_no_channel |
44 | 44 | from monai.transforms.transform import Transform |
45 | 45 | from monai.transforms.utility.array import EnsureChannelFirst |
| 46 | +from monai.utils import ImageMetaKey as Key |
46 | 47 | from monai.utils import ( |
47 | 48 | GridSamplePadMode, |
48 | 49 | ImageMetaKey, |
@@ -162,11 +163,21 @@ def __init__( |
162 | 163 | in the metadata (nested dictionary). default is ".", see also :py:class:`monai.transforms.DeleteItemsd`. |
163 | 164 | e.g. ``prune_meta_pattern=".*_code$", prune_meta_sep=" "`` removes meta keys that ends with ``"_code"``. |
164 | 165 | 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). |
167 | 168 | args: additional parameters for reader if providing a reader name. |
168 | 169 | kwargs: additional parameters for reader if providing a reader name. |
169 | 170 |
|
| 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 | +
|
170 | 181 | Note: |
171 | 182 |
|
172 | 183 | - The transform returns a MetaTensor, unless `set_track_meta(False)` has been used, in which case, a |
@@ -218,21 +229,53 @@ def __init__( |
218 | 229 | if self.raise_on_missing_reader: |
219 | 230 | raise OptionalImportError(msg) |
220 | 231 | 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 | + ) |
222 | 237 | continue |
223 | 238 | try: |
224 | 239 | self.register(the_reader(*args, **kwargs)) |
225 | 240 | 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 | + ) |
227 | 244 | if self.raise_on_missing_reader: |
228 | 245 | raise OptionalImportError(msg) from e |
229 | 246 | 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 | + ) |
231 | 252 | 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 | + ) |
233 | 258 | self.register(the_reader()) |
234 | 259 | 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()) |
236 | 279 | else: |
237 | 280 | self.register(_r) # reader instance, ignoring the constructor args/kwargs |
238 | 281 | return |
|
0 commit comments