Skip to content

Commit a5ed44b

Browse files
author
Sumit Kumar Das
committed
fix: capture optional_import availability flag for SummaryWriter
optional_import() returns a lazy-raising stub on failure, never None, so the previous 'SummaryWriter is None' guard could never trigger and the RuntimeError was unreachable. Capture and check the availability flag instead, document the exception in the docstring, and add a regression test per CodeRabbit review.
1 parent 2cefafe commit a5ed44b

2 files changed

Lines changed: 15 additions & 3 deletions

File tree

monai/handlers/tensorboard_handlers.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
Engine, _ = optional_import(
3232
"ignite.engine", IgniteInfo.OPT_IMPORT_VERSION, min_version, "Engine", as_type="decorator"
3333
)
34-
SummaryWriter, _ = optional_import("torch.utils.tensorboard", name="SummaryWriter")
34+
SummaryWriter, _tb_available = optional_import("torch.utils.tensorboard", name="SummaryWriter")
3535
SummaryWriterX, _ = optional_import("tensorboardX", name="SummaryWriter")
3636

3737
DEFAULT_TAG = "Loss"
@@ -46,11 +46,14 @@ class TensorBoardHandler:
4646
default to create a new TensorBoard writer.
4747
log_dir: if using default SummaryWriter, write logs to this directory, default is `./runs`.
4848
49+
Raises:
50+
RuntimeError: When ``summary_writer`` is ``None`` and the ``tensorboard`` package is not installed.
51+
4952
"""
5053

5154
def __init__(self, summary_writer: SummaryWriter | SummaryWriterX | None = None, log_dir: str = "./runs"):
5255
if summary_writer is None:
53-
if SummaryWriter is None:
56+
if not _tb_available:
5457
raise RuntimeError(
5558
"TensorBoardHandler requires tensorboard to be installed. "
5659
"Please install it with: pip install tensorboard"

tests/handlers/test_handler_tb_stats.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@
1414
import glob
1515
import tempfile
1616
import unittest
17-
from unittest.mock import MagicMock
17+
from unittest.mock import MagicMock, patch
1818

1919
from ignite.engine import Engine, Events
2020
from parameterized import parameterized
2121

2222
from monai.handlers import TensorBoardStatsHandler
23+
from monai.handlers.tensorboard_handlers import TensorBoardHandler
2324
from monai.utils import optional_import
2425

2526
SummaryWriter, has_tb = optional_import("torch.utils.tensorboard", name="SummaryWriter")
@@ -162,5 +163,13 @@ def _update_metric(engine):
162163
) # 2 = len([1, 3]) from event_filter
163164

164165

166+
class TestTensorBoardHandlerMissingDependency(unittest.TestCase):
167+
168+
def test_raises_when_tensorboard_unavailable(self):
169+
with patch("monai.handlers.tensorboard_handlers._tb_available", False):
170+
with self.assertRaises(RuntimeError):
171+
TensorBoardHandler()
172+
173+
165174
if __name__ == "__main__":
166175
unittest.main()

0 commit comments

Comments
 (0)