diff --git a/xarray/core/_typed_ops.py b/xarray/core/_typed_ops.py index 9b79ed46a9c..8dd409e1dae 100644 --- a/xarray/core/_typed_ops.py +++ b/xarray/core/_typed_ops.py @@ -4,7 +4,7 @@ from __future__ import annotations import operator -from typing import TYPE_CHECKING, Any, Callable, overload +from typing import TYPE_CHECKING, Any, Callable from xarray.core import nputils, ops from xarray.core.types import ( @@ -12,9 +12,7 @@ DsCompatible, GroupByCompatible, Self, - T_DataArray, T_Xarray, - VarCompatible, ) if TYPE_CHECKING: @@ -437,358 +435,6 @@ def conjugate(self, *args: Any, **kwargs: Any) -> Self: conjugate.__doc__ = ops.conjugate.__doc__ -class VariableOpsMixin: - __slots__ = () - - def _binary_op( - self, other: VarCompatible, f: Callable, reflexive: bool = False - ) -> Self: - raise NotImplementedError - - @overload - def __add__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __add__(self, other: VarCompatible) -> Self: - ... - - def __add__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.add) - - @overload - def __sub__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __sub__(self, other: VarCompatible) -> Self: - ... - - def __sub__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.sub) - - @overload - def __mul__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __mul__(self, other: VarCompatible) -> Self: - ... - - def __mul__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.mul) - - @overload - def __pow__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __pow__(self, other: VarCompatible) -> Self: - ... - - def __pow__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.pow) - - @overload - def __truediv__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __truediv__(self, other: VarCompatible) -> Self: - ... - - def __truediv__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.truediv) - - @overload - def __floordiv__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __floordiv__(self, other: VarCompatible) -> Self: - ... - - def __floordiv__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.floordiv) - - @overload - def __mod__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __mod__(self, other: VarCompatible) -> Self: - ... - - def __mod__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.mod) - - @overload - def __and__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __and__(self, other: VarCompatible) -> Self: - ... - - def __and__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.and_) - - @overload - def __xor__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __xor__(self, other: VarCompatible) -> Self: - ... - - def __xor__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.xor) - - @overload - def __or__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __or__(self, other: VarCompatible) -> Self: - ... - - def __or__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.or_) - - @overload - def __lshift__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __lshift__(self, other: VarCompatible) -> Self: - ... - - def __lshift__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.lshift) - - @overload - def __rshift__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __rshift__(self, other: VarCompatible) -> Self: - ... - - def __rshift__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.rshift) - - @overload - def __lt__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __lt__(self, other: VarCompatible) -> Self: - ... - - def __lt__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.lt) - - @overload - def __le__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __le__(self, other: VarCompatible) -> Self: - ... - - def __le__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.le) - - @overload - def __gt__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __gt__(self, other: VarCompatible) -> Self: - ... - - def __gt__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.gt) - - @overload - def __ge__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __ge__(self, other: VarCompatible) -> Self: - ... - - def __ge__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, operator.ge) - - @overload # type:ignore[override] - def __eq__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __eq__(self, other: VarCompatible) -> Self: - ... - - def __eq__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, nputils.array_eq) - - @overload # type:ignore[override] - def __ne__(self, other: T_DataArray) -> T_DataArray: - ... - - @overload - def __ne__(self, other: VarCompatible) -> Self: - ... - - def __ne__(self, other: VarCompatible) -> Self | T_DataArray: - return self._binary_op(other, nputils.array_ne) - - def __radd__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.add, reflexive=True) - - def __rsub__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.sub, reflexive=True) - - def __rmul__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.mul, reflexive=True) - - def __rpow__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.pow, reflexive=True) - - def __rtruediv__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.truediv, reflexive=True) - - def __rfloordiv__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.floordiv, reflexive=True) - - def __rmod__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.mod, reflexive=True) - - def __rand__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.and_, reflexive=True) - - def __rxor__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.xor, reflexive=True) - - def __ror__(self, other: VarCompatible) -> Self: - return self._binary_op(other, operator.or_, reflexive=True) - - def _inplace_binary_op(self, other: VarCompatible, f: Callable) -> Self: - raise NotImplementedError - - def __iadd__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.iadd) - - def __isub__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.isub) - - def __imul__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.imul) - - def __ipow__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.ipow) - - def __itruediv__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.itruediv) - - def __ifloordiv__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.ifloordiv) - - def __imod__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.imod) - - def __iand__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.iand) - - def __ixor__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.ixor) - - def __ior__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.ior) - - def __ilshift__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.ilshift) - - def __irshift__(self, other: VarCompatible) -> Self: # type:ignore[misc] - return self._inplace_binary_op(other, operator.irshift) - - def _unary_op(self, f: Callable, *args: Any, **kwargs: Any) -> Self: - raise NotImplementedError - - def __neg__(self) -> Self: - return self._unary_op(operator.neg) - - def __pos__(self) -> Self: - return self._unary_op(operator.pos) - - def __abs__(self) -> Self: - return self._unary_op(operator.abs) - - def __invert__(self) -> Self: - return self._unary_op(operator.invert) - - def round(self, *args: Any, **kwargs: Any) -> Self: - return self._unary_op(ops.round_, *args, **kwargs) - - def argsort(self, *args: Any, **kwargs: Any) -> Self: - return self._unary_op(ops.argsort, *args, **kwargs) - - def conj(self, *args: Any, **kwargs: Any) -> Self: - return self._unary_op(ops.conj, *args, **kwargs) - - def conjugate(self, *args: Any, **kwargs: Any) -> Self: - return self._unary_op(ops.conjugate, *args, **kwargs) - - __add__.__doc__ = operator.add.__doc__ - __sub__.__doc__ = operator.sub.__doc__ - __mul__.__doc__ = operator.mul.__doc__ - __pow__.__doc__ = operator.pow.__doc__ - __truediv__.__doc__ = operator.truediv.__doc__ - __floordiv__.__doc__ = operator.floordiv.__doc__ - __mod__.__doc__ = operator.mod.__doc__ - __and__.__doc__ = operator.and_.__doc__ - __xor__.__doc__ = operator.xor.__doc__ - __or__.__doc__ = operator.or_.__doc__ - __lshift__.__doc__ = operator.lshift.__doc__ - __rshift__.__doc__ = operator.rshift.__doc__ - __lt__.__doc__ = operator.lt.__doc__ - __le__.__doc__ = operator.le.__doc__ - __gt__.__doc__ = operator.gt.__doc__ - __ge__.__doc__ = operator.ge.__doc__ - __eq__.__doc__ = nputils.array_eq.__doc__ - __ne__.__doc__ = nputils.array_ne.__doc__ - __radd__.__doc__ = operator.add.__doc__ - __rsub__.__doc__ = operator.sub.__doc__ - __rmul__.__doc__ = operator.mul.__doc__ - __rpow__.__doc__ = operator.pow.__doc__ - __rtruediv__.__doc__ = operator.truediv.__doc__ - __rfloordiv__.__doc__ = operator.floordiv.__doc__ - __rmod__.__doc__ = operator.mod.__doc__ - __rand__.__doc__ = operator.and_.__doc__ - __rxor__.__doc__ = operator.xor.__doc__ - __ror__.__doc__ = operator.or_.__doc__ - __iadd__.__doc__ = operator.iadd.__doc__ - __isub__.__doc__ = operator.isub.__doc__ - __imul__.__doc__ = operator.imul.__doc__ - __ipow__.__doc__ = operator.ipow.__doc__ - __itruediv__.__doc__ = operator.itruediv.__doc__ - __ifloordiv__.__doc__ = operator.ifloordiv.__doc__ - __imod__.__doc__ = operator.imod.__doc__ - __iand__.__doc__ = operator.iand.__doc__ - __ixor__.__doc__ = operator.ixor.__doc__ - __ior__.__doc__ = operator.ior.__doc__ - __ilshift__.__doc__ = operator.ilshift.__doc__ - __irshift__.__doc__ = operator.irshift.__doc__ - __neg__.__doc__ = operator.neg.__doc__ - __pos__.__doc__ = operator.pos.__doc__ - __abs__.__doc__ = operator.abs.__doc__ - __invert__.__doc__ = operator.invert.__doc__ - round.__doc__ = ops.round_.__doc__ - argsort.__doc__ = ops.argsort.__doc__ - conj.__doc__ = ops.conj.__doc__ - conjugate.__doc__ = ops.conjugate.__doc__ - - class DatasetGroupByOpsMixin: __slots__ = () diff --git a/xarray/namedarray/_typed_ops.py b/xarray/namedarray/_typed_ops.py new file mode 100644 index 00000000000..201ab0dc278 --- /dev/null +++ b/xarray/namedarray/_typed_ops.py @@ -0,0 +1,220 @@ +"""Mixin classes with arithmetic operators.""" +# This file was generated using xarray.util.generate_ops. Do not edit manually. + +from __future__ import annotations + +import operator +from typing import TYPE_CHECKING, Any, Callable + +from xarray.core import nputils, ops + +if TYPE_CHECKING: + from xarray.namedarray.utils import NamedArrayCompatible, Self + + +class NamedArrayOpsMixin: + __slots__ = () + + def _binary_op( + self, other: NamedArrayCompatible, f: Callable, reflexive: bool = False + ) -> Self: + raise NotImplementedError + + def __add__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.add) + + def __sub__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.sub) + + def __mul__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.mul) + + def __pow__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.pow) + + def __truediv__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.truediv) + + def __floordiv__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.floordiv) + + def __mod__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.mod) + + def __and__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.and_) + + def __xor__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.xor) + + def __or__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.or_) + + def __lshift__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.lshift) + + def __rshift__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.rshift) + + def __lt__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.lt) + + def __le__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.le) + + def __gt__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.gt) + + def __ge__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.ge) + + def __eq__(self, other: NamedArrayCompatible) -> Self: # type:ignore[override] + return self._binary_op(other, nputils.array_eq) + + def __ne__(self, other: NamedArrayCompatible) -> Self: # type:ignore[override] + return self._binary_op(other, nputils.array_ne) + + def __radd__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.add, reflexive=True) + + def __rsub__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.sub, reflexive=True) + + def __rmul__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.mul, reflexive=True) + + def __rpow__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.pow, reflexive=True) + + def __rtruediv__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.truediv, reflexive=True) + + def __rfloordiv__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.floordiv, reflexive=True) + + def __rmod__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.mod, reflexive=True) + + def __rand__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.and_, reflexive=True) + + def __rxor__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.xor, reflexive=True) + + def __ror__(self, other: NamedArrayCompatible) -> Self: + return self._binary_op(other, operator.or_, reflexive=True) + + def _inplace_binary_op(self, other: NamedArrayCompatible, f: Callable) -> Self: + raise NotImplementedError + + def __iadd__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.iadd) + + def __isub__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.isub) + + def __imul__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.imul) + + def __ipow__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.ipow) + + def __itruediv__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.itruediv) + + def __ifloordiv__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.ifloordiv) + + def __imod__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.imod) + + def __iand__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.iand) + + def __ixor__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.ixor) + + def __ior__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.ior) + + def __ilshift__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.ilshift) + + def __irshift__(self, other: NamedArrayCompatible) -> Self: + return self._inplace_binary_op(other, operator.irshift) + + def _unary_op(self, f: Callable, *args: Any, **kwargs: Any) -> Self: + raise NotImplementedError + + def __neg__(self) -> Self: + return self._unary_op(operator.neg) + + def __pos__(self) -> Self: + return self._unary_op(operator.pos) + + def __abs__(self) -> Self: + return self._unary_op(operator.abs) + + def __invert__(self) -> Self: + return self._unary_op(operator.invert) + + def round(self, *args: Any, **kwargs: Any) -> Self: + return self._unary_op(ops.round_, *args, **kwargs) + + def argsort(self, *args: Any, **kwargs: Any) -> Self: + return self._unary_op(ops.argsort, *args, **kwargs) + + def conj(self, *args: Any, **kwargs: Any) -> Self: + return self._unary_op(ops.conj, *args, **kwargs) + + def conjugate(self, *args: Any, **kwargs: Any) -> Self: + return self._unary_op(ops.conjugate, *args, **kwargs) + + __add__.__doc__ = operator.add.__doc__ + __sub__.__doc__ = operator.sub.__doc__ + __mul__.__doc__ = operator.mul.__doc__ + __pow__.__doc__ = operator.pow.__doc__ + __truediv__.__doc__ = operator.truediv.__doc__ + __floordiv__.__doc__ = operator.floordiv.__doc__ + __mod__.__doc__ = operator.mod.__doc__ + __and__.__doc__ = operator.and_.__doc__ + __xor__.__doc__ = operator.xor.__doc__ + __or__.__doc__ = operator.or_.__doc__ + __lshift__.__doc__ = operator.lshift.__doc__ + __rshift__.__doc__ = operator.rshift.__doc__ + __lt__.__doc__ = operator.lt.__doc__ + __le__.__doc__ = operator.le.__doc__ + __gt__.__doc__ = operator.gt.__doc__ + __ge__.__doc__ = operator.ge.__doc__ + __eq__.__doc__ = nputils.array_eq.__doc__ + __ne__.__doc__ = nputils.array_ne.__doc__ + __radd__.__doc__ = operator.add.__doc__ + __rsub__.__doc__ = operator.sub.__doc__ + __rmul__.__doc__ = operator.mul.__doc__ + __rpow__.__doc__ = operator.pow.__doc__ + __rtruediv__.__doc__ = operator.truediv.__doc__ + __rfloordiv__.__doc__ = operator.floordiv.__doc__ + __rmod__.__doc__ = operator.mod.__doc__ + __rand__.__doc__ = operator.and_.__doc__ + __rxor__.__doc__ = operator.xor.__doc__ + __ror__.__doc__ = operator.or_.__doc__ + __iadd__.__doc__ = operator.iadd.__doc__ + __isub__.__doc__ = operator.isub.__doc__ + __imul__.__doc__ = operator.imul.__doc__ + __ipow__.__doc__ = operator.ipow.__doc__ + __itruediv__.__doc__ = operator.itruediv.__doc__ + __ifloordiv__.__doc__ = operator.ifloordiv.__doc__ + __imod__.__doc__ = operator.imod.__doc__ + __iand__.__doc__ = operator.iand.__doc__ + __ixor__.__doc__ = operator.ixor.__doc__ + __ior__.__doc__ = operator.ior.__doc__ + __ilshift__.__doc__ = operator.ilshift.__doc__ + __irshift__.__doc__ = operator.irshift.__doc__ + __neg__.__doc__ = operator.neg.__doc__ + __pos__.__doc__ = operator.pos.__doc__ + __abs__.__doc__ = operator.abs.__doc__ + __invert__.__doc__ = operator.invert.__doc__ + round.__doc__ = ops.round_.__doc__ + argsort.__doc__ = ops.argsort.__doc__ + conj.__doc__ = ops.conj.__doc__ + conjugate.__doc__ = ops.conjugate.__doc__ diff --git a/xarray/util/generate_ops.py b/xarray/util/generate_ops.py index f339470884a..832ebe529f4 100644 --- a/xarray/util/generate_ops.py +++ b/xarray/util/generate_ops.py @@ -4,6 +4,7 @@ Usage: python xarray/util/generate_ops.py > xarray/core/_typed_ops.py + python xarray/util/generate_ops.py namedarray > xarray/namedarray/_typed_ops.py """ # Note: the comments in https://github.com/pydata/xarray/pull/4904 provide some @@ -11,6 +12,7 @@ from __future__ import annotations +import sys from collections.abc import Iterator, Sequence from typing import Optional @@ -216,11 +218,11 @@ def unops() -> list[OpsType]: ops_info["DataArrayOpsMixin"] = ( binops(other_type="DaCompatible") + inplace(other_type="DaCompatible") + unops() ) -ops_info["VariableOpsMixin"] = ( - binops_overload(other_type="VarCompatible", overload_type="T_DataArray") - + inplace(other_type="VarCompatible", type_ignore="misc") - + unops() -) +# ops_info["VariableOpsMixin"] = ( +# binops_overload(other_type="VarCompatible", overload_type="T_DataArray") +# + inplace(other_type="VarCompatible", type_ignore="misc") +# + unops() +# ) ops_info["DatasetGroupByOpsMixin"] = binops( other_type="GroupByCompatible", return_type="Dataset" ) @@ -228,6 +230,7 @@ def unops() -> list[OpsType]: other_type="T_Xarray", return_type="T_Xarray" ) + MODULE_PREAMBLE = '''\ """Mixin classes with arithmetic operators.""" # This file was generated using xarray.util.generate_ops. Do not edit manually. @@ -235,7 +238,7 @@ def unops() -> list[OpsType]: from __future__ import annotations import operator -from typing import TYPE_CHECKING, Any, Callable, overload +from typing import TYPE_CHECKING, Any, Callable from xarray.core import nputils, ops from xarray.core.types import ( @@ -243,9 +246,7 @@ def unops() -> list[OpsType]: DsCompatible, GroupByCompatible, Self, - T_DataArray, T_Xarray, - VarCompatible, ) if TYPE_CHECKING: @@ -260,9 +261,9 @@ class {cls_name}: {method}.__doc__ = {func}.__doc__""" -def render(ops_info: dict[str, list[OpsType]]) -> Iterator[str]: +def render(preamble: str, ops_info: dict[str, list[OpsType]]) -> Iterator[str]: """Render the module or stub file.""" - yield MODULE_PREAMBLE + yield preamble for cls_name, method_blocks in ops_info.items(): yield CLASS_PREAMBLE.format(cls_name=cls_name, newline="\n") @@ -282,6 +283,41 @@ def _render_classbody(method_blocks: list[OpsType]) -> Iterator[str]: yield COPY_DOCSTRING.format(method=method, func=func) +### NamedArray typed ops ### + +ops_info_namedarray = {} +ops_info_namedarray["NamedArrayOpsMixin"] = ( + binops(other_type="NamedArrayCompatible") + + inplace(other_type="NamedArrayCompatible") + + unops() +) + + +MODULE_PREAMBLE_NAMEDARRAY = '''\ +"""Mixin classes with arithmetic operators.""" +# This file was generated using xarray.util.generate_ops. Do not edit manually. + +from __future__ import annotations + +import operator +from typing import TYPE_CHECKING, Any, Callable + +from xarray.core import nputils, ops +if TYPE_CHECKING: + from xarray.namedarray.utils import NamedArrayCompatible, Self''' + + if __name__ == "__main__": - for line in render(ops_info): + argv = sys.argv[1:] + + if len(argv) == 0: + preamble = MODULE_PREAMBLE + info = ops_info + elif len(argv) == 1 and argv[0] == "namedarray": + preamble = MODULE_PREAMBLE_NAMEDARRAY + info = ops_info_namedarray + else: + raise ValueError('run generate_ops.py without arguments or only "namedarray"') + + for line in render(preamble, info): print(line)