Python functions to save JSON and H5 to local files and S3
The S3-functionality wraps the specific code, which does not change the variables. So how about a decorator?

from functools import wraps

def handle_s3_upload(fcn):
    @wraps(fcn)
    def inner(data_fp, data, *args, **kwargs):
        # handle S3 path
        s3 = False
        if data_fp.lower().startswith('s3://'):
            s3_data_fp = data_fp
            data_fp = os.path.join(_TMP, os.path.basename(data_fp))
            s3 = True
        # call decorated function
        fcn(data_fp, data, *args, **kwargs)
        # S3 upload
        if s3:
            save_in_s3(data_fp, s3_data_fp)
    return inner

@handle_s3_upload
def save_json(data_fp, data, sort_keys=True, indent=4):
    with open(data_fp, 'w') as output_file:
        json.dump(data, output_file, cls=NumpyEncoder, sort_keys=sort_keys,
                  indent=indent)

@handle_s3_upload
def save_hdf5(data_fp, data, metadata=None):
    if metadata is None:
        metadata = {}
    mode = 'w'
    if os.path.isfile(data_fp):
        mode = 'r+'
    with h5py.File(data_fp, mode) as h5_file:
        for key, value in data.items():
            dataset = h5_file.create_dataset(key, data=value)