'Download an S3 object to a file.
Variants have also been injected into S3 client, Bucket and Object.
You don\'t have to use S3Transfer.download_file() directly.'

def download_file(self, bucket, key, filename, extra_args=None, callback=None):

    if (not isinstance(filename, six.string_types)):
        raise ValueError('Filename    must    be    a    string')
    subscribers = self._get_subscribers(callback)
    future = self._manager.download(bucket, key, filename, extra_args, subscribers)
    try:
        future.result()
    except S3TransferRetriesExceededError as e:
        raise RetriesExceededError(e.last_exception)
