code: def resolve_data_objects(objects, project=None, folder=None, batchsize=1000):
      
      if not isinstance(batchsize, int) or batchsize <= 0 or batchsize > 1000:
          raise ValueError("batchsize for resolve_data_objects must be a positive integer not exceeding 1000")
      args = {}
      if project:
          args.update({'project': project})
      if folder:
          args.update({'folder': folder})
  
      results = []
  
      # Call API method /system/resolveDataObjects in groups of size batchsize
      for i in range(0, len(objects), batchsize):
          args.update({'objects': objects[i:(i+batchsize)]})
          results.extend(dxpy.api.system_resolve_data_objects(args)['results'])
      return results
docs: :param objects: Data object specifications, each with fields "name"
                      (required), "folder", and "project"
      :type objects: list of dictionaries
      :param project: ID of project context; a data object's project defaults
                      to this if not specified for that object
      :type project: string
      :param folder: Folder path within the project; a data object's folder
                     path defaults to this if not specified for that object
      :type folder: string
      :param batchsize: Number of objects to resolve in each batch call to
                        system_resolve_data_objects; defaults to 1000 and is
                        only used for testing (must be a positive integer not
                        exceeding 1000)
      :type batchsize: int
      :returns: List of results parallel to input objects, where each
                entry is a list containing 0 or more dicts, each corresponding
                to a resolved object
      :rtype: List of lists of dictionaries
  
      Each returned element is a list of dictionaries with keys "project" and
      "id". The number of dictionaries for each element may be 0, 1, or more.