code: def set_metadata(candidates, traces, dependencies, pythons):
      
      metasets_mapping = _calculate_metasets_mapping(
          dependencies, pythons, copy.deepcopy(traces),
      )
      for key, candidate in candidates.items():
          candidate.markers = _format_metasets(metasets_mapping[key])
docs: Add "metadata" to candidates based on the dependency tree.
  
      Metadata for a candidate includes markers and a specifier for Python
      version requirements.
  
      :param candidates: A key-candidate mapping. Candidates in the mapping will
          have their markers set.
      :param traces: A graph trace (produced by `traces.trace_graph`) providing
          information about dependency relationships between candidates.
      :param dependencies: A key-collection mapping containing what dependencies
          each candidate in `candidates` requested.
      :param pythons: A key-str mapping containing Requires-Python information
          of each candidate.
  
      Keys in mappings and entries in the trace are identifiers of a package, as
      implemented by the `identify` method of the resolver's provider.
  
      The candidates are modified in-place.