@@ -219,7 +219,7 @@ def __repr__(self):
219219RemoveNode = _RemoveNode ()
220220
221221
222- def walk_and_modify (top , callback , postorder = True , _context = None ):
222+ def walk_and_modify (top , callback , postorder = True , _context = None , in_place = False ):
223223 """Modify a tree by walking it with a callback function. It also has
224224 the effect of doing a deep copy.
225225
@@ -279,14 +279,17 @@ def _handle_callback(node, json_id):
279279 return _handle_generator (result )
280280
281281 def _handle_mapping (node , json_id ):
282- if isinstance (node , lazy_nodes .AsdfOrderedDictNode ):
283- result = collections .OrderedDict ()
284- elif isinstance (node , lazy_nodes .AsdfDictNode ):
285- result = {}
282+ if in_place :
283+ result = node
286284 else :
287- result = node .__class__ ()
288- if isinstance (node , tagged .Tagged ):
289- result ._tag = node ._tag
285+ if isinstance (node , lazy_nodes .AsdfOrderedDictNode ):
286+ result = collections .OrderedDict ()
287+ elif isinstance (node , lazy_nodes .AsdfDictNode ):
288+ result = {}
289+ else :
290+ result = node .__class__ ()
291+ if isinstance (node , tagged .Tagged ):
292+ result ._tag = node ._tag
290293
291294 pending_items = {}
292295 for key , value in node .items ():
@@ -300,13 +303,15 @@ def _handle_mapping(node, json_id):
300303
301304 elif (val := _recurse (value , json_id )) is not RemoveNode :
302305 result [key ] = val
306+ # TODO handle RemoveNode
303307
304308 yield result
305309
306310 if len (pending_items ) > 0 :
307311 # Now that we've yielded, the pending children should
308312 # be available.
309313 for key , value in pending_items .items ():
314+ # TODO handle RemoveNode
310315 if (val := _recurse (value , json_id )) is not RemoveNode :
311316 result [key ] = val
312317 else :
@@ -315,12 +320,23 @@ def _handle_mapping(node, json_id):
315320 del result [key ]
316321
317322 def _handle_mutable_sequence (node , json_id ):
318- if isinstance (node , lazy_nodes .AsdfListNode ):
319- result = []
323+ if in_place :
324+ result = node
325+
326+ def setter (i , v ):
327+ result [i ] = v
328+
320329 else :
321- result = node .__class__ ()
322- if isinstance (node , tagged .Tagged ):
323- result ._tag = node ._tag
330+
331+ def setter (i , v ):
332+ result .append (v )
333+
334+ if isinstance (node , lazy_nodes .AsdfListNode ):
335+ result = []
336+ else :
337+ result = node .__class__ ()
338+ if isinstance (node , tagged .Tagged ):
339+ result ._tag = node ._tag
324340
325341 pending_items = {}
326342 for i , value in enumerate (node ):
@@ -330,9 +346,11 @@ def _handle_mutable_sequence(node, json_id):
330346 # PendingValue instance for now, and note that we'll
331347 # need to fill in the real value later.
332348 pending_items [i ] = value
333- result .append (PendingValue )
349+ setter (i , PendingValue )
350+ # result.append(PendingValue)
334351 else :
335- result .append (_recurse (value , json_id ))
352+ setter (i , _recurse (value , json_id ))
353+ # result.append(_recurse(value, json_id))
336354
337355 yield result
338356
@@ -346,6 +364,9 @@ def _handle_immutable_sequence(node, json_id):
346364 # to construct (well, maybe possible in a C extension, but
347365 # we're not going to worry about that), so we don't need
348366 # to yield here.
367+ if in_place :
368+ # TODO better error
369+ raise Exception ("fail" )
349370 contents = [_recurse (value , json_id ) for value in node ]
350371
351372 result = node .__class__ (contents )
0 commit comments