88
99import functools
1010import logging
11- from collections .abc import Hashable , ItemsView , Iterator , Mapping
11+ from collections .abc import Callable , Hashable , ItemsView , Iterator , Mapping
1212from dataclasses import dataclass
1313from typing import (
1414 TYPE_CHECKING ,
1515 Any ,
16- Callable ,
1716 overload ,
1817)
1918from warnings import warn
@@ -804,7 +803,7 @@ def upper(self, value: ConstantLike) -> None:
804803 value = DataArray (value ).broadcast_like (self .upper )
805804 if not set (value .dims ).issubset (self .model .variables [self .name ].dims ):
806805 raise ValueError ("Cannot assign new dimensions to existing variable." )
807- self .data [ "upper" ] = value
806+ self ._data = assign_multiindex_safe ( self . data , upper = value )
808807
809808 @property
810809 def lower (self ) -> DataArray :
@@ -828,7 +827,7 @@ def lower(self, value: ConstantLike) -> None:
828827 value = DataArray (value ).broadcast_like (self .lower )
829828 if not set (value .dims ).issubset (self .model .variables [self .name ].dims ):
830829 raise ValueError ("Cannot assign new dimensions to existing variable." )
831- self .data [ "lower" ] = value
830+ self ._data = assign_multiindex_safe ( self . data , lower = value )
832831
833832 @property
834833 @has_optimized_model
@@ -1108,8 +1107,7 @@ def bfill(self, dim: str, limit: None = None) -> Variable:
11081107 .map (DataArray .bfill , dim = dim , limit = limit )
11091108 .fillna (self ._fill_value )
11101109 )
1111- data = data .assign (labels = data .labels .astype (int ))
1112- return self .__class__ (data , self .model , self .name )
1110+ return self .assign (labels = data .labels .astype (int ))
11131111
11141112 def sanitize (self ) -> Variable :
11151113 """
@@ -1120,8 +1118,7 @@ def sanitize(self) -> Variable:
11201118 linopy.Variable
11211119 """
11221120 if issubdtype (self .labels .dtype , floating ):
1123- data = self .data .assign (labels = self .labels .fillna (- 1 ).astype (int ))
1124- return self .__class__ (data , self .model , self .name )
1121+ return self .assign (labels = self .labels .fillna (- 1 ).astype (int ))
11251122 return self
11261123
11271124 def equals (self , other : Variable ) -> bool :
@@ -1132,6 +1129,8 @@ def equals(self, other: Variable) -> bool:
11321129
11331130 assign_coords = varwrap (Dataset .assign_coords )
11341131
1132+ assign = varwrap (assign_multiindex_safe )
1133+
11351134 assign_multiindex_safe = varwrap (assign_multiindex_safe )
11361135
11371136 broadcast_like = varwrap (Dataset .broadcast_like )
@@ -1499,7 +1498,9 @@ def set_blocks(self, blocks: DataArray) -> None:
14991498
15001499 for name , variable in self .items ():
15011500 if dim in variable .dims :
1502- variable .data ["blocks" ] = blocks .broadcast_like (variable .labels )
1501+ variable ._data = assign_multiindex_safe (
1502+ variable .data , blocks = blocks .broadcast_like (variable .labels )
1503+ )
15031504
15041505 def get_blockmap (self , dtype : type = np .int8 ) -> ndarray :
15051506 """
0 commit comments