From 00a1b56852570fc1e6704e7c6011b55480b00ff9 Mon Sep 17 00:00:00 2001
From: Greg Wilson <greg.wilson@plot.ly>
Date: Thu, 22 May 2025 14:47:17 -0400
Subject: [PATCH] feat: restore type checking portion of code generation

-   Restore code removed in #4978.
-   (Partially) closes #5186.
---
 codegen/__init__.py | 40 ++++++++++++++++++++++++++--------------
 codegen/utils.py    | 16 ++++++++++------
 2 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/codegen/__init__.py b/codegen/__init__.py
index d3bb05f2ec4..b86b5be8b62 100644
--- a/codegen/__init__.py
+++ b/codegen/__init__.py
@@ -271,24 +271,36 @@ def perform_codegen(reformat=True):
         root_datatype_imports.append(f"._deprecations.{dep_clas}")
 
     optional_figure_widget_import = f"""
-__all__.append("FigureWidget")
-orig_getattr = __getattr__
-def __getattr__(import_name):
-    if import_name == "FigureWidget":
-        try:
-            import ipywidgets
-            from packaging.version import Version
-
-            if Version(ipywidgets.__version__) >= Version("7.0.0"):
-                from ..graph_objs._figurewidget import FigureWidget
+if sys.version_info < (3, 7) or TYPE_CHECKING:
+    try:
+        import ipywidgets as _ipywidgets
+        from packaging.version import Version as _Version
+        if _Version(_ipywidgets.__version__) >= _Version("7.0.0"):
+            from ..graph_objs._figurewidget import FigureWidget
+        else:
+            raise ImportError()
+    except Exception:
+        from ..missing_anywidget import FigureWidget
+else:
+    __all__.append("FigureWidget")
+    orig_getattr = __getattr__
+    def __getattr__(import_name):
+        if import_name == "FigureWidget":
+            try:
+                import ipywidgets
+                from packaging.version import Version
+                if Version(ipywidgets.__version__) >= Version("7.0.0"):
+                    from ..graph_objs._figurewidget import FigureWidget
+                    return FigureWidget
+                else:
+                    raise ImportError()
+            except Exception:
+                from ..missing_anywidget import FigureWidget
                 return FigureWidget
             else:
                 raise ImportError()
-        except Exception:
-            from ..missing_anywidget import FigureWidget
-            return FigureWidget
 
-    return orig_getattr(import_name)
+        return orig_getattr(import_name)
 """
     # ### __all__ ###
     for path_parts, class_names in alls.items():
diff --git a/codegen/utils.py b/codegen/utils.py
index 8c68d017c00..09468b10068 100644
--- a/codegen/utils.py
+++ b/codegen/utils.py
@@ -82,12 +82,16 @@ def build_from_imports_py(rel_modules=(), rel_classes=(), init_extra=""):
 
     result = f"""\
 import sys
-from _plotly_utils.importers import relative_import
-__all__, __getattr__, __dir__ = relative_import(
-    __name__,
-    {repr(rel_modules)},
-    {repr(rel_classes)}
-)
+from typing import TYPE_CHECKING
+if sys.version_info < (3, 7) or TYPE_CHECKING:
+    {imports_str}
+else:
+    from _plotly_utils.importers import relative_import
+    __all__, __getattr__, __dir__ = relative_import(
+        __name__,
+        {repr(rel_modules)},
+        {repr(rel_classes)}
+    )
 
 {init_extra}
 """