Skip to content

Commit 6d7595b

Browse files
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. Also define _tb_available in the TYPE_CHECKING branch so static analysis sees it (mypy reported it as undefined). Signed-off-by: skdas20 <skdas5405@gmail.com>
1 parent 2cefafe commit 6d7595b

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

monai/handlers/tensorboard_handlers.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@
2727
from ignite.engine import Engine
2828
from tensorboardX import SummaryWriter as SummaryWriterX
2929
from torch.utils.tensorboard import SummaryWriter
30+
31+
_tb_available = True
3032
else:
3133
Engine, _ = optional_import(
3234
"ignite.engine", IgniteInfo.OPT_IMPORT_VERSION, min_version, "Engine", as_type="decorator"
3335
)
34-
SummaryWriter, _ = optional_import("torch.utils.tensorboard", name="SummaryWriter")
36+
SummaryWriter, _tb_available = optional_import("torch.utils.tensorboard", name="SummaryWriter")
3537
SummaryWriterX, _ = optional_import("tensorboardX", name="SummaryWriter")
3638

3739
DEFAULT_TAG = "Loss"
@@ -46,11 +48,14 @@ class TensorBoardHandler:
4648
default to create a new TensorBoard writer.
4749
log_dir: if using default SummaryWriter, write logs to this directory, default is `./runs`.
4850
51+
Raises:
52+
RuntimeError: When ``summary_writer`` is ``None`` and the ``tensorboard`` package is not installed.
53+
4954
"""
5055

5156
def __init__(self, summary_writer: SummaryWriter | SummaryWriterX | None = None, log_dir: str = "./runs"):
5257
if summary_writer is None:
53-
if SummaryWriter is None:
58+
if not _tb_available:
5459
raise RuntimeError(
5560
"TensorBoardHandler requires tensorboard to be installed. "
5661
"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)