code: def download(url, dir, filename=None, expect_size=None):
      """
      Download URL to a directory.
      Will figure out the filename automatically from URL, if not given.
      """
      mkdir_p(dir)
      if filename is None:
          filename = url.split("/")[-1]
      fpath = os.path.join(dir, filename)
  
      if os.path.isfile(fpath):
          if (
              expect_size is not None
              and os.stat(fpath).st_size == expect_size
          ):
              logger.info(
                  "File {} exists! Skip download.".format(filename)
              )
              return fpath
          else:
              logger.warn(
                  "File {} exists. Will overwrite with a new download!".format(
                      filename
                  )
              )
  
      def hook(t):
          last_b = [0]
  
          def inner(b, bsize, tsize=None):
              if tsize is not None:
                  t.total = tsize
              t.update((b - last_b[0]) * bsize)
              last_b[0] = b
  
          return inner
  
      try:
          with tqdm.tqdm(
              unit="B", unit_scale=True, miniters=1, desc=filename
          ) as t:
              fpath, _ = urllib.request.urlretrieve(
                  url, fpath, reporthook=hook(t)
              )
          statinfo = os.stat(fpath)
          size = statinfo.st_size
      except IOError:
          logger.error("Failed to download {}".format(url))
          raise
      assert size > 0, "Downloaded an empty file from {}!".format(url)
  
      if expect_size is not None and size != expect_size:
          logger.error(
              "File downloaded from {} does not match the expected size!".format(
                  url
              )
          )
          logger.error(
              "You may have downloaded a broken file, or the upstream may have modified the file."
          )
  
      # TODO human-readable size
      logger.info(
          "Succesfully downloaded "
          + filename
          + ". "
          + str(size)
          + " bytes."
      )
      return fpath
  
file_path: tensorpack/tensorpack/utils/fs.py
imports: import errno
  import os
  import tqdm
  from six.moves import urllib
  from .None import logger
  from .utils import execute_only_once
label_desc: Use image node_id 2 for calling a global function with example usage: download(url, dir, filename, expect_size) and returns: fpath, inner, fpath