<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_backup_files(*, mongodump=MONGODB_DEFAULT_MONGODUMP, hosts={}, host_defaults={}, dry_run=False, **kwargs):
 """ Backup all specified databases into a gzipped tarball via mongodump :param mongodump(str, optional):
 Path to mongodump executable :param hosts(dict, optional):
 A dict containing hosts info to be backed up :param host_defaults(dict, optional):
 Default values applied to each host :param dry_run(bool, optional):
 Whether to activate dry run mode :param \*\*kwargs: arbitrary keyword arguments :raises TypeError: if an argument in kwargs does not have the type expected :raises ValueError: if an argument within kwargs has an invalid value """


    # Output directory
    output_dir = fs.get_output_dir()

    # Type checks
    utils.chkstr(mongodump, 'mongodump')

    # List of mongodb hosts holding databases
    mongodb_hosts = hosts
    if len(mongodb_hosts) == 0:
        raise ValueError("No mongodb 'hosts' specified!")

    # Default values applied to each host if necessary,
    # this setting takes effect on a 'cascade' fashion.
    mongodb_defaults = host_defaults

    # Collected list of files generated by _make_backup_file
    mongodump_files = {}

    # Backup cycle for each mongodb host
    for mongodb_host_name, mongodb_host in mongodb_hosts.items():

        if type(mongodb_host) != dict:
            raise TypeError("mongodb_host '{name}' must be dict"
                            .format(name=mongodb_host_name))

        # For each host, its 'address' is essential
        if 'address' not in mongodb_host:
            raise KeyError("No 'address' specified!")
        utils.chkstr(mongodb_host['address'], 'address')

        """
        For these keys, the value is going to be set in
        in a 'cascade' fashion, if the value is not already set,
        its value is going to be picked from the 'defaults'(mongodb_defaults)
        sub-section within 'mongodb', as a last resort, its hardcoded default
        value is going to be picked.
        """
        # TODO: there has to be something better than this
        _set_mongodb_host_val('user_name', MONGODB_DEFAULT_USER,
                              mongodb_host, mongodb_defaults)
        _set_mongodb_host_val('password', MONGODB_DEFAULT_PWD,
                              mongodb_host, mongodb_defaults)
        _set_mongodb_host_val('port', MONGODB_DEFAULT_PORT,
                              mongodb_host, mongodb_defaults)
        _set_mongodb_host_val('auth_db', MONGODB_DEFAULT_AUTH,
                              mongodb_host, mongodb_defaults)

        """Merge dbs list with that of the host_defaults section (if any)"""
        if 'dbs' in mongodb_defaults:
            if 'dbs' in mongodb_host:
                mongodb_host['dbs'] = _merge_dbs(mongodb_defaults['dbs'],
                                                 mongodb_host['dbs'])
            else:
                mongodb_host['dbs'] = mongodb_defaults['dbs']

        # Add the file name to the list to be returned
        mongodump_files[mongodb_host_name] = _make_backup_file(dry_run=dry_run, mongodump=mongodump,
                                                               output_dir=output_dir, name=mongodb_host_name,
                                                               **mongodb_host)
    # .. and finally, give it
    return mongodump_files