Open mahmoud opened 9 months ago
The easiest way to do that would be as a custom Mode -- maybe Trim
?
~ 15 LOC I can whip something up real quick
Hmm... I guess delete is an in-place mutation rather than returning a copy.
I think this would be easier to do as a follow-on step rather than mixing it into the guts of delete.
val = {"a": {"b": 1} }
glom(val, (Delete("a.b"), Trim()))
# val is now {}
Let me see if this reasoning makes sense:
Recursive deleting "along a path" is probably not so much what is intended as recursive deletion of a subtree. That is, you just need to get the glom target to the right place and then let it go.
The interesting bits:
bool
A switch would almost work -- except this requires post-evaluation not pre-evaluation. Switch({bool: T}, default=SKIP)
or maybe And(bool, T, default=SKIP)
. Then wrap it with a Ref
. The hard part is it is going to go parent-to-child, whereas for this operation you want to evaluate child-to-parent. Same with **
in a path.
I wonder if there's something general there. Kind of like T
is the target going in, is there some expression or mechanism when the return depends on the subspec evaluation.
It's trivial with a custom spec -- the return value is passing through glomit()
.
If there was such a thing as post-evaluation **
, then trim might look like this: ('**', Or(bool, Delete()))
Traverse()
was going to be the more general **
, maybe this is a test use-case?
Of course, plain python recursion would have better performance than bouncing each item through glom.
For this case, a copy was fine, and remap
did the job. Agree that is_empty
should be a param. But bool
alone doesn't capture the "empty container" common case; it'll notably remove 0
/0.0
which are often important values.
I think a recursive path trim makes sense as a separate step/spec. Even if it's not "context-free" for the whole tree like remap
, i suspect it's still useful, as I've occasionally had APIs explode at empty values on specific paths only.
(additional context: this was a pre-step for db persistence, to minimize the size of a record)
Chatting with @hynek tonight, seems like there's a market for a
Delete
/delete
flag to remove the value at a path if it's empty, and its parent if it's empty, and so on.Kind of like
rm -r
(orrmdir
, in that it fails/stops if the container isn't empty).(Tangentially related, remap can do this for a whole object, but it's not very convenient for recursively deleting a specific path.)