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
@@ -755,7 +754,7 @@ def upper(self, value: ConstantLike) -> None:
755754 value = DataArray (value ).broadcast_like (self .upper )
756755 if not set (value .dims ).issubset (self .model .variables [self .name ].dims ):
757756 raise ValueError ("Cannot assign new dimensions to existing variable." )
758- self .data [ "upper" ] = value
757+ self ._data = assign_multiindex_safe ( self . data , upper = value )
759758
760759 @property
761760 def lower (self ) -> DataArray :
@@ -779,7 +778,7 @@ def lower(self, value: ConstantLike) -> None:
779778 value = DataArray (value ).broadcast_like (self .lower )
780779 if not set (value .dims ).issubset (self .model .variables [self .name ].dims ):
781780 raise ValueError ("Cannot assign new dimensions to existing variable." )
782- self .data [ "lower" ] = value
781+ self ._data = assign_multiindex_safe ( self . data , lower = value )
783782
784783 @property
785784 @has_optimized_model
@@ -1059,8 +1058,7 @@ def bfill(self, dim: str, limit: None = None) -> Variable:
10591058 .map (DataArray .bfill , dim = dim , limit = limit )
10601059 .fillna (self ._fill_value )
10611060 )
1062- data = data .assign (labels = data .labels .astype (int ))
1063- return self .__class__ (data , self .model , self .name )
1061+ return self .assign (labels = data .labels .astype (int ))
10641062
10651063 def sanitize (self ) -> Variable :
10661064 """
@@ -1071,8 +1069,7 @@ def sanitize(self) -> Variable:
10711069 linopy.Variable
10721070 """
10731071 if issubdtype (self .labels .dtype , floating ):
1074- data = self .data .assign (labels = self .labels .fillna (- 1 ).astype (int ))
1075- return self .__class__ (data , self .model , self .name )
1072+ return self .assign (labels = self .labels .fillna (- 1 ).astype (int ))
10761073 return self
10771074
10781075 def equals (self , other : Variable ) -> bool :
@@ -1083,6 +1080,8 @@ def equals(self, other: Variable) -> bool:
10831080
10841081 assign_coords = varwrap (Dataset .assign_coords )
10851082
1083+ assign = varwrap (assign_multiindex_safe )
1084+
10861085 assign_multiindex_safe = varwrap (assign_multiindex_safe )
10871086
10881087 broadcast_like = varwrap (Dataset .broadcast_like )
@@ -1450,7 +1449,9 @@ def set_blocks(self, blocks: DataArray) -> None:
14501449
14511450 for name , variable in self .items ():
14521451 if dim in variable .dims :
1453- variable .data ["blocks" ] = blocks .broadcast_like (variable .labels )
1452+ variable ._data = assign_multiindex_safe (
1453+ variable .data , blocks = blocks .broadcast_like (variable .labels )
1454+ )
14541455
14551456 def get_blockmap (self , dtype : type = np .int8 ) -> ndarray :
14561457 """
0 commit comments