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}]