1
+ __all__ = ["DataSpec" , "DataOptions" ]
2
+
3
+
1
4
# standard library
2
- from dataclasses import dataclass
3
- from typing import Any , Dict , Hashable , Optional , Type
5
+ from dataclasses import dataclass , field
6
+ from typing import Any , Dict , Generic , Hashable , Optional , Type , TypeVar
4
7
5
8
6
9
# dependencies
7
10
from typing_extensions import Literal , TypeAlias
8
11
9
12
10
13
# submodules
11
- from .typing import Dims , DataClass , AnyDType
14
+ from .typing import AnyDType , AnyXarray , DataClass , Dims
12
15
13
16
14
17
# type hints
15
18
AnySpec : TypeAlias = "ArraySpec | ScalarSpec"
19
+ TReturn = TypeVar ("TReturn" , AnyXarray , None )
16
20
17
21
18
22
# runtime classes
@@ -56,7 +60,7 @@ class ScalarSpec:
56
60
"""Data type of the scalar."""
57
61
58
62
59
- class Specs (Dict [str , AnySpec ]):
63
+ class SpecDict (Dict [str , AnySpec ]):
60
64
"""Dictionary of any specifications."""
61
65
62
66
@property
@@ -78,3 +82,22 @@ def of_data(self) -> Dict[str, ArraySpec]:
78
82
def of_name (self ) -> Dict [str , ScalarSpec ]:
79
83
"""Limit to name specifications."""
80
84
return {k : v for k , v in self .items () if v .role == "name" }
85
+
86
+
87
+ @dataclass (frozen = True )
88
+ class DataOptions (Generic [TReturn ]):
89
+ """Options for xarray data creation."""
90
+
91
+ factory : Type [TReturn ]
92
+ """Factory for xarray data creation."""
93
+
94
+
95
+ @dataclass (frozen = True )
96
+ class DataSpec :
97
+ """Data specification of an xarray dataclass."""
98
+
99
+ specs : SpecDict = field (default_factory = SpecDict )
100
+ """Dictionary of any specifications."""
101
+
102
+ options : DataOptions [Any ] = DataOptions (type (None ))
103
+ """Options for xarray data creation."""
0 commit comments