@@ -98,7 +98,10 @@ def __getitem__(
9898 if isinstance (index , (int , np .generic )):
9999 return self ._data [int (index )]
100100 elif isinstance (index , str ):
101- return self ._data [self ._id2offset [index ]]
101+ if index .startswith ('@' ):
102+ return self .traverse_flat (index [1 :])
103+ else :
104+ return self ._data [self ._id2offset [index ]]
102105 elif isinstance (index , slice ):
103106 return DocumentArray (self ._data [index ])
104107 elif index is Ellipsis :
@@ -129,9 +132,14 @@ def __setitem__(
129132 self ._data [index ] = value
130133 self ._id2offset [value .id ] = index
131134 elif isinstance (index , str ):
132- old_idx = self ._id2offset .pop (index )
133- self ._data [old_idx ] = value
134- self ._id2offset [value .id ] = old_idx
135+ if index .startswith ('@' ):
136+ for _d , _v in zip (self .traverse_flat (index [1 :]), value ):
137+ _d ._data = _v ._data
138+ self ._rebuild_id2offset ()
139+ else :
140+ old_idx = self ._id2offset .pop (index )
141+ self ._data [old_idx ] = value
142+ self ._id2offset [value .id ] = old_idx
135143 elif isinstance (index , slice ):
136144 self ._data [index ] = value
137145 self ._rebuild_id2offset ()
@@ -177,7 +185,10 @@ def __delitem__(self, index: 'DocumentArrayIndexType'):
177185 self ._id2offset .pop (self ._data [index ].id )
178186 del self ._data [index ]
179187 elif isinstance (index , str ):
180- del self ._data [self ._id2offset [index ]]
188+ if index .startswith ('@' ):
189+ raise NotImplementedError ('Delete elements along traversal paths is not implemented' )
190+ else :
191+ del self ._data [self ._id2offset [index ]]
181192 self ._id2offset .pop (index )
182193 elif isinstance (index , slice ):
183194 del self ._data [index ]
0 commit comments