human
Complete this python program:
def cache(*depends_on):
assistant
#Here is the Python program you requested.

    """Caches function result in temporary file.
    Cache will be expired when modification date of files from `depends_on`
    will be changed.
    Function wrapped in `cache` should be arguments agnostic.
    """
    def _get_mtime(name):
        path = os.path.join(os.path.expanduser('~'), name)
        try:
            return str(os.path.getmtime(path))
        except OSError:
            return '0'
    @decorator
    def _cache(fn, *args, **kwargs):
        if cache.disabled:
            return fn(*args, **kwargs)
        key = '{}.{}'.format(fn.__module__, repr(fn).split('at')[0])
        etag = '.'.join((_get_mtime(name) for name in depends_on))
        cache_dir = get_cache_dir()
        cache_path = Path(cache_dir).joinpath('thefuck').as_posix()
        try:
            with closing(shelve.open(cache_path)) as db:
                if (db.get(key, {}).get('etag') == etag):
                    return db[key]['value']
                else:
                    value = fn(*args, **kwargs)
                    db[key] = {'etag': etag, 'value': value}
                    return value
        except (shelve_open_error, ImportError):
            warn('Removing    possibly    out-dated    cache')
            os.remove(cache_path)
            with closing(shelve.open(cache_path)) as db:
                value = fn(*args, **kwargs)
                db[key] = {'etag': etag, 'value': value}
                return value
    return _cache