Helper library for filtering and getting object matched to one or more search attribute. Includes a cache so that on repeat calls of the same search criteria the objects do not need re-filtering.
Install with pip via pip install key-store.
To create a new key-store from a list of object (or dictionaries) and keys
from dataclasses import dataclass
from key_store import KeyStore
@dataclass
class ExampleClass:
name: str
value: int
group: str
# With objects
store = KeyStore(
keys=["name", "value", "group"],
objects=[
ExampleClass(name="Example 1", value=1, group="A"),
ExampleClass(name="Example 2", value=2, group="B"),
ExampleClass(name="Example 3", value=3, group="A"),
ExampleClass(name="Example 4", value=4, group="B"),
],
)
# With dictionaries
dict_store = KeyStore(
keys=["name", "value", "group"],
objects=[
{"name": "Example 1", "value": 1, "group": "A"},
{"name": "Example 2", "value": 2, "group": "B"},
{"name": "Example 3", "value": 3, "group": "A"},
{"name": "Example 4", "value": 4, "group": "B"},
],
)From this point onwards the examples will use objects, however all of the same actions can be performed with dictionaries.
If you are using a data class or dictionary then you can use the
get_keys function to automatically create you keys input like;
from key_store import get_keys
# Instead of writing out the keys manually you can use
get_keys(ExampleClass)
# returns: ["name", "value", "group"]If you want to search for a single item in your store and get that item the you should use the get one method. For example;
store.get_one(name="Example 1")
# returns: ExampleClass(name="Example 1", value=1, group="A")Searches can be done using one search criteria as in the example above or multiple like;
store.get_one(group="A", value=3)
# returns: ExampleClass(name="Example 3", value=3, group="A")If an object matching the search criteria doesn't exist in the store then the
get_one function will raise an error;
store.get_one(name="Example 1", group="C")
# returns: a raised errorIf you're not sure if an object matching the search criteria exists in the store
and you don't want to raise an error then you can use the get_one_or_none
method. For example;
store.get_one_or_none(name="Example 1", group="C")
# returns: NoneThe get function returns a list of objects that match with the search criteria, or an empty list if none match.
Multiple matches exist;
obj_store.get(group="A")
# returns: [
# ExampleClass(name="Example 1", value=1, group="A"),
# ExampleClass(name="Example 3", value=3, group="A"),
#]A single match exits;
obj_store.get(group="A", value=3)
# returns: [
# ExampleClass(name="Example 3", value=3, group="A"),
#]No matches exist;
obj_store.get(name="Not in store")
# returns: []