Skip to content

Commit 84a7b36

Browse files
committed
if non-xarray add array impl. call
1 parent bf5e18a commit 84a7b36

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/earthkit/meteo/solar/solar.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@
2626
import numpy as np
2727
import xarray # type: ignore[import]
2828

29-
# NOTE: this must exist at runtime too (don’t put it under TYPE_CHECKING)
3029
DateLike: TypeAlias = "datetime.datetime | np.datetime64"
3130

3231
ArrayLike: TypeAlias = Any
3332

3433

3534
def _dispatch_if_xarray(func_name: str, *args: Any, **kwargs: Any) -> Any | None:
36-
"""Dispatch to the xarray implementation if any positional argument is xarray."""
35+
# Solar functions often take `date` as a scalar and lat/lon as xarray objects.
36+
# The default dispatch() only checks the first argument, so it would incorrectly
37+
# select the array backend and drop xarray metadata. This ensures we use the
38+
# xarray implementation whenever any argument is xarray.
3739
if any(_is_xarray(a) for a in args):
3840
module = import_module(__name__.rsplit(".", 1)[0] + ".xarray")
3941
return getattr(module, func_name)(*args, **kwargs)
@@ -63,10 +65,10 @@ def julian_day(date):
6365
6466
- :py:meth:`earthkit.meteo.solar.xarray.julian_day` for xarray.DataArray
6567
- :py:meth:`earthkit.meteo.solar.array.julian_day` for scalar/array inputs
66-
(including ``numpy.datetime64``)
6768
6869
"""
69-
return dispatch(julian_day, date)
70+
r = dispatch(julian_day, date)
71+
return r if r is not None else array.julian_day(date)
7072

7173

7274
@overload
@@ -95,10 +97,10 @@ def solar_declination_angle(date):
9597
9698
- :py:meth:`earthkit.meteo.solar.xarray.solar_declination_angle` for xarray.DataArray
9799
- :py:meth:`earthkit.meteo.solar.array.solar_declination_angle` for scalar/array inputs
98-
(including ``numpy.datetime64``)
99100
100101
"""
101-
return dispatch(solar_declination_angle, date)
102+
r = dispatch(solar_declination_angle, date)
103+
return r if r is not None else array.solar_declination_angle(date)
102104

103105

104106
@overload

0 commit comments

Comments
 (0)