def put_files(self, key_paths, overwrite=True):
    '\n        Put files to S3 in parallel.\n\n        Args:\n            key_paths: (required) an iterator of (key, path) tuples.\n            overwrite: (optional) overwrites the key with obj, if it exists\n\n        Returns:\n            a list of (key, S3 URL) tuples corresponding to the files sent.\n        '

    def _check():
        for (key, path) in key_paths:
            if (not os.path.exists(path)):
                raise MetaflowS3NotFound(('Local file not found: %s' % path))
            (yield (path, self._url(key), key))
    return self._put_many_files(_check(), overwrite)
Put files to S3 in parallel.

Args:
    key_paths: (required) an iterator of (key, path) tuples.
    overwrite: (optional) overwrites the key with obj, if it exists

Returns:
    a list of (key, S3 URL) tuples corresponding to the files sent.
def put_files(self, key_paths, overwrite=True):
    '\n        Put files to S3 in parallel.\n\n        Args:\n            key_paths: (required) an iterator of (key, path) tuples.\n            overwrite: (optional) overwrites the key with obj, if it exists\n\n        Returns:\n            a list of (key, S3 URL) tuples corresponding to the files sent.\n        '

    def _check():
        for (key, path) in key_paths:
            if (not os.path.exists(path)):
                raise MetaflowS3NotFound(('Local file not found: %s' % path))
            (yield (path, self._url(key), key))
    return self._put_many_files(_check(), overwrite)