forked from GilbertLabUCSF/CanDI
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path_database.py
More file actions
55 lines (47 loc) · 2.06 KB
/
Copy path_database.py
File metadata and controls
55 lines (47 loc) · 2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from typing import Any
class CancerDataNamespace:
"""Reusable namespace for attribute-style dataset access under `.data`."""
__slots__ = ("_parent",)
def __init__(self, parent: Any) -> None:
object.__setattr__(self, "_parent", parent)
def __getattr__(self, name: str) -> Any:
if name in self._parent._datasets:
return self._parent._datasets[name]
if name in self._parent._paths:
raise AttributeError(
f"Dataset '{name}' is available but not loaded. Call `.load('{name}')` first."
)
raise AttributeError(f"No dataset named '{name}' defined.")
def __setattr__(self, name: str, value: Any) -> None:
if name == "_parent":
object.__setattr__(self, name, value)
return
self.add(name=name, dataset=value)
def __dir__(self):
return sorted(
set(super().__dir__())
| set(self._parent._paths)
| set(self._parent._datasets)
)
def add(self, name: str, dataset: Any, overwrite: bool = False) -> None:
"""Add a dataset to this namespace."""
if not name or not isinstance(name, str):
raise ValueError("Dataset name must be a non-empty string.")
if not name.isidentifier():
raise ValueError(
f"Dataset name '{name}' is not a valid Python identifier for attribute access."
)
if name in object.__dir__(self):
raise ValueError(
f"Dataset name '{name}' conflicts with an existing namespace attribute."
)
if name in self._parent._datasets and not overwrite:
raise ValueError(
f"Dataset '{name}' is already loaded. Pass overwrite=True to replace it."
)
if name in self._parent._paths and not overwrite:
raise ValueError(
f"Dataset '{name}' is already defined as an available built-in dataset. "
f"Pass overwrite=True to replace it."
)
self._parent._datasets[name] = dataset