Skip to content

Mutations

Warning

Please, make sure you've covered Reference / Basics first.

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

  • c.Mut.set_item(name, value) - d[name] = value but as conversions
  • c.Mut.set_attr(name, value) - setattr(obj, name, value)
  • c.Mut.del_item(index) - d.pop(index)
  • c.Mut.del_item(index, if_exists=True) - d.pop(index, None)
  • c.Mut.del_attr(index) - delattr(obj, index)
  • c.Mut.del_attr(index, if_exists=True) - same, but if the attr exists
  • c.Mut.custom(any_conversion)

and they cannot be used outside of the below methods.

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}]
def iter_mut__(extra, data_):
    for item__ in data_:
        item__["c"] = item__["a"] + item__["b"]
        item__.pop("a")
        item__.pop("d", None)
        item__.update(extra)
        yield item__

def converter(data_, *, extra):
    try:
        return list(iter_mut__(extra, data_))
    except __exceptions_to_dump_sources:
        __convtools__code_storage.dump_sources()
        raise

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}]
def tap__(data, data_):
    data_["c"] = data_["a"] + data_["b"]
    data_.pop("a")
    data_.update(data)
    return data_

def converter(data_, *, data):
    try:
        return [tap__(data, i) for i in data_]
    except __exceptions_to_dump_sources:
        __convtools__code_storage.dump_sources()
        raise