Skip to content

Mutations

Please, make sure you've covered Basics first.

Mutations are conversions which update the data in-place. Here is the list of supported mutations:

expected code mutation
d[name] = value c.Mut.set_item(name, value)
d[1][2][name] = value c.Mut.set_item(name, value, of_=c.item(1,2))
setattr(obj, name, value) c.Mut.set_attr(name, value)
setattr(obj.a, name, value) c.Mut.set_attr(name, value, of_=c.attr("a"))
d.pop(index) c.Mut.del_item(index)
d.pop(index, None) c.Mut.del_item(index, if_exists=True)
d[1][2].pop(index) c.Mut.del_item(index, of_=c.item(1,2))
delattr(obj, attr) c.Mut.del_attr(attr)
same, but if attr exists c.Mut.del_attr(attr, if_exists=True)
delattr(obj.a.b, attr) c.Mut.del_attr(attr, of_=c.attr("a", "b"))
run a custom conversion c.Mut.custom(any_conversion)

These mutations can only be used inside the methods below.

c.iter_mut

c.iter_mut(*mutations) mutates each element of a sequence and returns an iterator of mutated objects.

from convtools import conversion as c

input_data = [{"a": 1, "b": 2}]

converter = (
    c.iter_mut(
        c.Mut.set_item("c", c.item("a") + c.item("b")),
        c.Mut.del_item("a"),
        c.Mut.del_item("d", if_exists=True),
        c.Mut.custom(c.this.call_method("update", c.input_arg("extra"))),
    )
    .as_type(list)
    .gen_converter(debug=True)
)

assert converter(input_data, extra={"d": 4}) == [{"b": 2, "c": 3, "d": 4}]

c.tap

c.tap(*mutations) and tap conversion method mutate a single object.

from convtools import conversion as c

input_data = [{"a": 1, "b": 2}]

converter = c.list_comp(
    c.tap(
        c.Mut.set_item("c", c.item("a") + c.item("b")),
        c.Mut.del_item("a"),
        c.Mut.custom(c.this.call_method("update", c.input_arg("data"))),
    )
).gen_converter(debug=True)

assert converter(input_data, data={"d": 4}) == [{"b": 2, "c": 3, "d": 4}]