preinit.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from __future__ import annotations
  2. from typing import Any, Callable
  3. import wandb
  4. class PreInitObject:
  5. def __init__(self, name: str, destination: Any | None = None) -> None:
  6. self._name = name
  7. if destination is not None:
  8. self.__doc__ = destination.__doc__
  9. def __getitem__(self, key: str) -> None:
  10. raise wandb.Error(f"You must call wandb.init() before {self._name}[{key!r}]")
  11. def __setitem__(self, key: str, value: Any) -> Any:
  12. raise wandb.Error(f"You must call wandb.init() before {self._name}[{key!r}]")
  13. def __setattr__(self, key: str, value: Any) -> Any:
  14. if not key.startswith("_"):
  15. raise wandb.Error(f"You must call wandb.init() before {self._name}.{key}")
  16. else:
  17. return object.__setattr__(self, key, value)
  18. def __getattr__(self, key: str) -> Any:
  19. if not key.startswith("_"):
  20. raise wandb.Error(f"You must call wandb.init() before {self._name}.{key}")
  21. else:
  22. raise AttributeError
  23. def PreInitCallable( # noqa: N802
  24. name: str, destination: Any | None = None
  25. ) -> Callable:
  26. def preinit_wrapper(*args: Any, **kwargs: Any) -> Any:
  27. raise wandb.Error(f"You must call wandb.init() before {name}()")
  28. preinit_wrapper.__name__ = str(name)
  29. if destination:
  30. preinit_wrapper.__wrapped__ = destination # type: ignore
  31. preinit_wrapper.__doc__ = destination.__doc__
  32. return preinit_wrapper