Fuso¶
Fuso is a Python library for merging and manipulating dictionaries and lists of dictionaries.
Fuso provides functions for merging dictionaries and lists of dictionaries, sorting, and converting between different data structures. It also includes a factory function for creating custom merge functions.
create_merge_factory(merge_functions=None, key_order=None, post_processor=None)
¶
Create a merge function that merges arbitrarily nested dictionaries.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
merge_functions
|
dict[str, Callable[[Any, Any], Any]] | None
|
Dictionary of functions to use for merging specific keys |
None
|
key_order
|
list[str] | None
|
List of keys to determine the order of merging. |
None
|
post_processor
|
callable | None
|
Function to process the result after merging |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
Callable |
Callable[[dict, dict], dict]
|
Function that merges two arbitrarily nested dictionaries. |
Example
merge_with_custom_functions = create_merge_factory(
merge_functions={
"age": lambda o, u: min(o, u),
},
post_processor=lambda d: d.update({"name": d["name"].upper()})
)
original = {
"name": "Alice",
"age": 30,
"tags": ["user"],
}
updates = {
"age": 31,
"tags": ["editor"],
}
merged = merge_with_custom_functions(original, updates)
assert merged == {
"name": "ALICE",
"age": 30,
"tags": ["user", "editor"],
}
Source code in src/fuso/factories.py
create_merge_list_of_dicts_by_key_factory(key, default_key=None, merge_functions=None, object_key_order=None)
¶
Create a merge function that merges two lists of dictionaries by a specified key.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
str
|
Key to use for merging |
required |
default_key
|
str | None
|
Key to use for default updates |
None
|
merge_functions
|
dict[str, Callable[[Any, Any], Any]] | None
|
Dictionary of functions to use for merging specific keys |
None
|
object_key_order
|
list[str] | None
|
Non-exhaustive list of keys to sort objects by |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
Callable |
Callable[[list[dict], list[dict]], list[dict]]
|
Function that merges two lists of dictionaries by a specified key. |
Example
merge_by_id = create_merge_list_of_dicts_by_key_factory(key="id")
values = [
{"id": 1, "name": "Alice", "tags": ["user"]},
{"id": 2, "name": "Bob", "tags": ["admin"]},
]
updates = [
{"id": 1, "tags": ["editor"]},
{"id": 3, "name": "Charlie", "tags": ["user"]},
]
merged = merge_by_id(values, updates)
assert merged == [
{"id": 1, "name": "Alice", "tags": ["user", "editor"]},
{"id": 2, "name": "Bob", "tags": ["admin"]},
{"id": 3, "name": "Charlie", "tags": ["user"]},
]
Source code in src/fuso/factories.py
merge_dict(original, updates, merge_functions=None, post_processor=None, key_order=None)
¶
Merge two dictionaries.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
original
|
dict
|
Original dictionary |
required |
updates
|
dict
|
Dictionary with updates |
required |
merge_functions
|
dict[str, Callable[[Any, Any], Any]] | None
|
Dictionary of functions to use for merging specific keys |
None
|
post_processor
|
callable | None
|
Function to process the result after merging |
None
|
key_order
|
list[str] | None
|
Non-exhaustive list of keys to sort by |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
dict |
dict
|
Merged dictionary |
Example
original = {
"name": "Alice",
"age": 30,
"tags": ["user"],
}
updates = {
"age": 31,
"tags": ["editor"],
}
merged = merge_dict(
original,
updates,
merge_functions={
"age": lambda o, u: min(o, u),
},
post_processor=lambda d: d.update({"name": d["name"].upper()})
)
assert merged == {
"name": "ALICE",
"age": 30,
"tags": ["user", "editor"],
}
Source code in src/fuso/dicts.py
merge_list_of_dicts_by_key(values, updates, key, default_key=None, merge_functions=None, object_key_order=None)
¶
Merge two lists of dictionaries by a specified key.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
values
|
list[dict]
|
List of original dictionaries |
required |
updates
|
list[dict]
|
List of dictionaries with updates |
required |
key
|
str
|
Key to use for merging |
required |
default_key
|
str | None
|
Key to use for default updates |
None
|
merge_functions
|
dict[str, Callable[[Any, Any], Any]] | None
|
Dictionary of functions to use for merging specific keys |
None
|
object_key_order
|
list[str] | None
|
Non-exhaustive list of keys to sort objects by |
None
|
Returns:
| Type | Description |
|---|---|
list[dict]
|
list[dict]: Merged list of dictionaries |
Example
values = [
{"id": 1, "name": "Alice", "tags": ["user"]},
{"id": 2, "name": "Bob", "tags": ["admin"]},
]
updates = [
{"id": 1, "tags": ["editor"]},
{"id": 3, "name": "Charlie", "tags": ["user"]},
]
merged = merge_list_of_dicts_by_key(values, updates, key="id")
assert merged == [
{"id": 1, "name": "Alice", "tags": ["user", "editor"]},
{"id": 2, "name": "Bob", "tags": ["admin"]},
{"id": 3, "name": "Charlie", "tags": ["user"]},
]
Source code in src/fuso/lists.py
sort_dict(d, key_order=None)
¶
Sort a dictionary by a given (non-exhaustive) key order.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
d
|
dict
|
dictionary to sort |
required |
key_order
|
list[str]
|
Non-exhaustive list of keys to sort by |
None
|
Returns:
| Name | Type | Description |
|---|---|---|
dict |
dict
|
dictionary with ordered values |
Example
Source code in src/fuso/utils.py
sort_list_of_dicts_by_key(values, key, reverse=False)
¶
Sort a list of dictionaries by a specified key.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
values
|
list[dict]
|
List of dictionaries to sort |
required |
key
|
str
|
Key to sort by |
required |
reverse
|
bool
|
Whether to sort in descending order |
False
|
Returns:
| Type | Description |
|---|---|
list[dict]
|
list[dict]: Sorted list of dictionaries |
Example
values = [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25},
]
assert sort_list_of_dicts_by_key(values, key="age") == [
{"name": "Bob", "age": 25},
{"name": "Alice", "age": 30},
]
assert sort_list_of_dicts_by_key(values, key="age", reverse=True) == [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25},
]
Source code in src/fuso/utils.py
to_list_of_dicts_by_key(values, key='name')
¶
Convert a list of dictionaries to a dictionary of dictionaries using a specified key.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
values
|
list
|
List of dictionaries to convert |
required |
key
|
str
|
Key to use as the dictionary key |
'name'
|
Returns:
| Name | Type | Description |
|---|---|---|
dict |
dict
|
Dictionary of dictionaries |
Raises:
| Type | Description |
|---|---|
KeyError
|
If |