jax-ml/jax · error · RuntimeError
Cannot determine the ``__name__`` of the caller.
Error message
Cannot determine the ``__name__`` of the caller.
What it means
jax._src.lazy_loader.attach builds a PEP 562 lazy module by inspecting the caller frame's globals for __name__. If sys._getframe(1).f_globals has no __name__ key (e.g. exec'd namespace or unusual import machinery), it raises this RuntimeError because it cannot know which module to patch with lazily imported attributes.
Source
Thrown at jax/_src/lazy_loader.py:40
def attach(package_name: str, submodules: Sequence[str]) -> tuple[
Callable[[str], Any],
Callable[[], list[str]],
list[str],
]:
"""Lazily loads submodules of a package.
Returns:
A tuple of ``__getattr__``, ``__dir__`` function and ``__all__`` --
a list of available global names, which can be used to replace the
corresponding definitions in the package.
Raises:
RuntimeError: If the ``__name__`` of the caller cannot be determined.
"""
owner_name = sys._getframe(1).f_globals.get("__name__")
if owner_name is None:
raise RuntimeError("Cannot determine the ``__name__`` of the caller.")
__all__ = list(submodules)
def __getattr__(name: str) -> Any:
if name in submodules:
value = importlib.import_module(f"{package_name}.{name}")
# Update module-level globals to avoid calling ``__getattr__`` again
# for this ``name``.
assert owner_name is not None # pyrefly#40
setattr(sys.modules[owner_name], name, value)
return value
raise AttributeError(f"module '{package_name}' has no attribute '{name}'")
def __dir__() -> list[str]:
return __all__
return __getattr__, __dir__, __all__
View on GitHub (pinned to 1e1c6a8fc0)
Solutions
- Call attach at module top level in a real .py module so the caller frame has __name__
- Pass a namespace that includes __name__ if you must exec the code
- Avoid wrapping the attach call inside exec/eval or lambda frames
- Update JAX — this is internal API misuse, not a user configuration issue
Defensive patterns
Strategy: validation
Validate before calling
import sys frame_globals = sys._getframe(1).f_globals assert '__name__' in frame_globals, 'caller must be a real module'
Try / catch
try:
lazy_loader.attach(...)
except RuntimeError:
# execute inside a real module file instead
... Prevention
- Call lazy_loader.attach only at module top level
- Avoid exec()-based module loading around JAX internals
When it happens
Trigger: Calling lazy_loader.attach from code executed via exec() with a bare dict globals, from a REPL-like namespace without __name__, or from an embedding context where the frame globals lack __name__.
Common situations: Almost never seen by end users; occurs in exotic embedding, notebook kernels, or custom import hooks that strip __name__ from globals, or when attach is invoked inside a function called through C extensions where frame introspection is unusual.
Related errors
- Accumulator aval mismatch: expected {aval}, got {acc.aval}
- {name} cannot accept args with unreduced_kind={mat.unreduced
- module '{package_name}' has no attribute '{name}'
- Unsupported method: {method}
- Unknown action: {action}
AI-assisted analysis of jax-ml/jax@1e1c6a8fc0 (2026-08-27).
Data as JSON: /api/errors/64fc032550ceaa56.
Report an issue: GitHub.