docs: def read_catalog(catalog, default_values=None, catalog_format=None):
      """Toma una representación cualquiera de un catálogo, y devuelve su
      representación interna (un diccionario de Python con su metadata.)
  
      Si recibe una representación _interna_ (un diccionario), lo devuelve
      intacto. Si recibe una representación _externa_ (path/URL a un archivo
      JSON/XLSX), devuelve su represetación interna, es decir, un diccionario.
  
      Args:
          catalog (dict or str): Representación externa/interna de un catálogo.
              Una representación _externa_ es un path local o una URL remota a un
              archivo con la metadata de un catálogo, en formato JSON o XLSX. La
              representación _interna_ de un catálogo es un diccionario.
  
      Returns:
          dict: Representación interna de un catálogo para uso en las funciones
          de esta librería.
      """
      unknown_catalog_repr_msg = \
          """No se pudo inferir una representación válida de un catálogo del
          parámetro provisto: {}.""".format(catalog)
      assert isinstance(catalog, string_types + (dict,)
                        ), unknown_catalog_repr_msg
  
      if isinstance(catalog, dict):
          catalog_dict = catalog
  
      else:
          # catalog es una URL remota o un path local
          suffix = catalog.split(".")[-1].strip("/")
          if suffix in ('json', 'xlsx'):
              catalog_format = catalog_format or suffix
          if catalog_format == "xlsx":
              try:
                  catalog_dict = read_xlsx_catalog(catalog)
              except openpyxl_exceptions + \
                      (ValueError, AssertionError, IOError, BadZipfile) as e:
                  raise ce.NonParseableCatalog(catalog, str(e))
          elif catalog_format == "json":
              try:
                  catalog_dict = read_json(catalog)
              except(ValueError, TypeError, IOError) as e:
                  raise ce.NonParseableCatalog(catalog, str(e))
          elif catalog_format == "ckan":
              catalog_dict = read_ckan_catalog(catalog)
          else:
              catalog_dict = read_suffixless_catalog(catalog)
  
      # si se pasaron valores default, los aplica al catálogo leído
      if default_values:
          _apply_default_values(catalog_dict, default_values)
  
      return catalog_dict