Skip to main content

SolidJS style updating of nested python objects

Project description

Mutate nested Python objects using a method inspired by SolidJS’s setState function for updating stores.

https://www.solidjs.com/docs/latest/api#updating-stores

Examples

update lists by index

>>> from pymutator import mutate
>>> mutate([1, 2, 3, 4, 5], 3, 'D')
[1, 2, 3, 'D', 5]

update lists by list of indices

>>> mutate([1, 2, 3, 4, 5], [1, 3], 'D')
[1, 'D', 3, 'D', 5]

update lists by filter predicate

>>> mutate([1, 2, 3, 4, 5], lambda i: i%2, 'odd')
['odd', 2, 'odd', 4, 'odd']

update list with computed value

>>> mutate([1, 2, 3, 4, 5], 3, lambda i: f'D{i}')
[1, 2, 3, 'D4', 5]

update dict

>>> mutate({'a': 1, 'b': 2, 'c': 3}, 'b', 'B')
{'a': 1, 'b': 'B', 'c': 3}
>>> mutate({'a': 1, 'b': 2, 'c': 3}, b='B')
{'a': 1, 'b': 'B', 'c': 3}
>>> mutate({'a': 1, 'b': 2, 'c': 3}, {'b': 'B'})
{'a': 1, 'b': 'B', 'c': 3}
>>> mutate({'a': 1, 'b': 2, 'c': 3}, ['b', 'x'], 'B')
{'a': 1, 'b': 'B', 'c': 3, 'x': 'B'}

update dict with filter predicate

>>> mutate({'a': 1, 'b': 2, 'c': 3}, lambda i: i%2, 'odd')
{'a': 'odd', 'b': 2, 'c': 'odd'}

update dict with computed value

>>> mutate({'a': 1, 'b': 2, 'c': 3}, 'b', lambda i: f'B{i}')
{'a': 1, 'b': 'B2', 'c': 3}

update object

>>> class O:
...     def __init__(self): self.a = 1
>>> o = O()
>>> mutate(o, 'a', 2) and o.a
2
>>> mutate(o, a=3) and o.a
3
>>> mutate(o, {'a': 4}) and o.a
4
>>> mutate(o, 'a', lambda i: i+1) and o.a
5

updating nested objects

>>> store = {
...    'todos': [
...            {'task': 'Finish work', 'completed': False},
...            {'task': 'Go grocery shopping', 'completed': False},
...            {'task': 'Make dinner', 'completed': False},
...        ]
...    }
>>> mutate(store, 'todos', [0, 2], 'completed', True)
{'todos': [{'task': 'Finish work', 'completed': True}, {'task': 'Go grocery shopping', 'completed': False}, {'task': 'Make dinner', 'completed': True}]}
>>> mutate(store, 'todos', lambda todo: todo['completed'],
...        'task', lambda t: t + '!')
{'todos': [{'task': 'Finish work!', 'completed': True}, {'task': 'Go grocery shopping', 'completed': False}, {'task': 'Make dinner!', 'completed': True}]}

Running tests

$ pytest

Project details


Release history Release notifications | RSS feed

This version

0.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

PyMutator-0.1.tar.gz (4.0 kB view hashes)

Uploaded Source

Built Distribution

PyMutator-0.1-py3-none-any.whl (4.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page