| | |
| |
|
| | from typing import Any |
| | import pydoc |
| | from fvcore.common.registry import Registry |
| |
|
| | """ |
| | ``Registry`` and `locate` provide ways to map a string (typically found |
| | in config files) to callable objects. |
| | """ |
| |
|
| | __all__ = ["Registry", "locate"] |
| |
|
| |
|
| | def _convert_target_to_string(t: Any) -> str: |
| | """ |
| | Inverse of ``locate()``. |
| | |
| | Args: |
| | t: any object with ``__module__`` and ``__qualname__`` |
| | """ |
| | module, qualname = t.__module__, t.__qualname__ |
| |
|
| | |
| | |
| | |
| | |
| | module_parts = module.split(".") |
| | for k in range(1, len(module_parts)): |
| | prefix = ".".join(module_parts[:k]) |
| | candidate = f"{prefix}.{qualname}" |
| | try: |
| | if locate(candidate) is t: |
| | return candidate |
| | except ImportError: |
| | pass |
| | return f"{module}.{qualname}" |
| |
|
| |
|
| | def locate(name: str) -> Any: |
| | """ |
| | Locate and return an object ``x`` using an input string ``{x.__module__}.{x.__qualname__}``, |
| | such as "module.submodule.class_name". |
| | |
| | Raise Exception if it cannot be found. |
| | """ |
| | obj = pydoc.locate(name) |
| |
|
| | |
| | |
| | if obj is None: |
| | try: |
| | |
| | from hydra.utils import _locate |
| | except ImportError as e: |
| | raise ImportError(f"Cannot dynamically locate object {name}!") from e |
| | else: |
| | obj = _locate(name) |
| |
|
| | return obj |
| |
|