Skip to content

Commit 19e87d6

Browse files
committed
#121 Use overload in AsDataset
1 parent 96d058d commit 19e87d6

File tree

1 file changed

+121
-33
lines changed

1 file changed

+121
-33
lines changed

xarray_dataclasses/dataset.py

Lines changed: 121 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,12 @@ def __init__(self, *args: P.args, **kwargs: P.kwargs) -> None:
4949
__dataoptions__: DataOptions[TDataset]
5050

5151

52-
# custom classproperty
53-
class classproperty:
54-
"""Class property only for AsDataset.new().
55-
56-
As a classmethod and a property can be chained together since Python 3.9,
57-
this class will be removed when the support for Python 3.7 and 3.8 ends.
58-
59-
"""
60-
61-
def __init__(self, func: Callable[..., Any]) -> None:
62-
self.__func__ = func
63-
64-
def __get__(
65-
self,
66-
obj: Any,
67-
cls: Type[DatasetClass[P, TDataset]],
68-
) -> Callable[P, TDataset]:
69-
return self.__func__(cls)
70-
71-
7252
# runtime functions and classes
7353
@overload
7454
def asdataset(
7555
dataclass: DatasetClass[Any, TDataset],
7656
reference: Optional[DataType] = None,
77-
dataoptions: Any = DEFAULT_OPTIONS,
57+
dataoptions: DataOptions[Any] = DEFAULT_OPTIONS,
7858
) -> TDataset:
7959
...
8060

@@ -90,8 +70,8 @@ def asdataset(
9070

9171
def asdataset(
9272
dataclass: Any,
93-
reference: Any = None,
94-
dataoptions: Any = DEFAULT_OPTIONS,
73+
reference: Optional[DataType] = None,
74+
dataoptions: DataOptions[Any] = DEFAULT_OPTIONS,
9575
) -> Any:
9676
"""Create a Dataset object from a dataclass object.
9777
@@ -135,36 +115,82 @@ def asdataset(
135115
return dataset
136116

137117

118+
# runtime classes
119+
class classproperty:
120+
"""Class property only for AsDataset.new().
121+
122+
As a classmethod and a property can be chained together since Python 3.9,
123+
this class will be removed when the support for Python 3.7 and 3.8 ends.
124+
125+
"""
126+
127+
def __init__(self, func: Callable[..., Any]) -> None:
128+
self.__func__ = func
129+
130+
@overload
131+
def __get__(
132+
self,
133+
obj: Any,
134+
cls: Type[DatasetClass[P, TDataset]],
135+
) -> Callable[P, TDataset]:
136+
...
137+
138+
@overload
139+
def __get__(
140+
self,
141+
obj: Any,
142+
cls: Type[DataClass[P]],
143+
) -> Callable[P, xr.Dataset]:
144+
...
145+
146+
def __get__(self, obj: Any, cls: Any) -> Any:
147+
return self.__func__(cls)
148+
149+
138150
class AsDataset:
139151
"""Mix-in class that provides shorthand methods."""
140152

141-
__dataoptions__ = DEFAULT_OPTIONS
142-
143153
@classproperty
144-
def new(cls: Type[DatasetClass[P, TDataset]]) -> Callable[P, TDataset]:
154+
def new(cls: Any) -> Any:
145155
"""Create a Dataset object from dataclass parameters."""
146156

147-
init = copy(cls.__init__) # type: ignore
148-
init.__doc__ = cls.__init__.__doc__ # type: ignore
157+
init = copy(cls.__init__)
158+
init.__doc__ = cls.__init__.__doc__
149159
init.__annotations__["return"] = TDataset
150160

151161
@wraps(init)
152-
def new(
153-
cls: Type[DatasetClass[P, TDataset]],
154-
*args: P.args,
155-
**kwargs: P.kwargs,
156-
) -> TDataset:
162+
def new(cls: Any, *args: Any, **kwargs: Any) -> Any:
157163
return asdataset(cls(*args, **kwargs))
158164

159165
return MethodType(new, cls)
160166

167+
@overload
161168
@classmethod
162169
def empty(
163170
cls: Type[DatasetClass[P, TDataset]],
164171
sizes: Sizes,
165172
order: Order = "C",
166173
**kwargs: Any,
167174
) -> TDataset:
175+
...
176+
177+
@overload
178+
@classmethod
179+
def empty(
180+
cls: Type[DataClass[P]],
181+
sizes: Sizes,
182+
order: Order = "C",
183+
**kwargs: Any,
184+
) -> xr.Dataset:
185+
...
186+
187+
@classmethod
188+
def empty(
189+
cls: Any,
190+
sizes: Sizes,
191+
order: Order = "C",
192+
**kwargs: Any,
193+
) -> Any:
168194
"""Create a Dataset object without initializing data vars.
169195
170196
Args:
@@ -186,13 +212,33 @@ def empty(
186212

187213
return asdataset(cls(**data_vars, **kwargs))
188214

215+
@overload
189216
@classmethod
190217
def zeros(
191218
cls: Type[DatasetClass[P, TDataset]],
192219
sizes: Sizes,
193220
order: Order = "C",
194221
**kwargs: Any,
195222
) -> TDataset:
223+
...
224+
225+
@overload
226+
@classmethod
227+
def zeros(
228+
cls: Type[DataClass[P]],
229+
sizes: Sizes,
230+
order: Order = "C",
231+
**kwargs: Any,
232+
) -> xr.Dataset:
233+
...
234+
235+
@classmethod
236+
def zeros(
237+
cls: Any,
238+
sizes: Sizes,
239+
order: Order = "C",
240+
**kwargs: Any,
241+
) -> Any:
196242
"""Create a Dataset object whose data vars are filled with zeros.
197243
198244
Args:
@@ -214,13 +260,33 @@ def zeros(
214260

215261
return asdataset(cls(**data_vars, **kwargs))
216262

263+
@overload
217264
@classmethod
218265
def ones(
219266
cls: Type[DatasetClass[P, TDataset]],
220267
sizes: Sizes,
221268
order: Order = "C",
222269
**kwargs: Any,
223270
) -> TDataset:
271+
...
272+
273+
@overload
274+
@classmethod
275+
def ones(
276+
cls: Type[DataClass[P]],
277+
sizes: Sizes,
278+
order: Order = "C",
279+
**kwargs: Any,
280+
) -> xr.Dataset:
281+
...
282+
283+
@classmethod
284+
def ones(
285+
cls: Any,
286+
sizes: Sizes,
287+
order: Order = "C",
288+
**kwargs: Any,
289+
) -> Any:
224290
"""Create a Dataset object whose data vars are filled with ones.
225291
226292
Args:
@@ -242,6 +308,7 @@ def ones(
242308

243309
return asdataset(cls(**data_vars, **kwargs))
244310

311+
@overload
245312
@classmethod
246313
def full(
247314
cls: Type[DatasetClass[P, TDataset]],
@@ -250,6 +317,27 @@ def full(
250317
order: Order = "C",
251318
**kwargs: Any,
252319
) -> TDataset:
320+
...
321+
322+
@overload
323+
@classmethod
324+
def full(
325+
cls: Type[DataClass[P]],
326+
sizes: Sizes,
327+
fill_value: Any,
328+
order: Order = "C",
329+
**kwargs: Any,
330+
) -> xr.Dataset:
331+
...
332+
333+
@classmethod
334+
def full(
335+
cls: Any,
336+
sizes: Sizes,
337+
fill_value: Any,
338+
order: Order = "C",
339+
**kwargs: Any,
340+
) -> Any:
253341
"""Create a Dataset object whose data vars are filled with given value.
254342
255343
Args:

0 commit comments

Comments
 (0)