def update_value(dictionary: dict,
                 path: str,
                 value: object,
                 delimiter: str = ".") -> dict:
    """update a value from a dict. path to key can be passed by a string, separated by a delimiter
    Args:
        dictionary (dict): dict to be updated
        path (str): path with keys, separated by delimiter
        value (object): value to update.
        delimiter (str, optional): delimiter for path. Defaults to ".".
    Raises:
        TypeError: dictionary object is not a dict
        KeyError: key from path not found
    Returns:
        dict: updated dictionary with new value
    """
    if not isinstance(dictionary, dict):
        raise TypeError(f"you must pass a dict. You pass {type(dictionary)}")

    keys = path.split(delimiter)
    key = keys[0]
    if not dictionary.get(key):
        raise KeyError(f"key '{key}' not found")
    if len(keys) > 1:
        path = delimiter.join(keys[1:])
        update_value(
            dictionary=dictionary[key],
            path=path,
            value=value,
            delimiter=delimiter
        )
    else:
        dictionary[key] = value
    return dictionary