code: def _read_requirements(metadata, extras):
      
      extras = extras or ()
      requirements = []
      for entry in metadata.run_requires:
          if isinstance(entry, six.text_type):
              entry = {"requires": [entry]}
              extra = None
          else:
              extra = entry.get("extra")
          if extra is not None and extra not in extras:
              continue
          for line in entry.get("requires", []):
              r = requirementslib.Requirement.from_line(line)
              if r.markers:
                  contained = get_contained_extras(r.markers)
                  if (contained and not any(e in contained for e in extras)):
                      continue
                  marker = get_without_extra(r.markers)
                  r.markers = str(marker) if marker else None
                  line = r.as_line(include_hashes=False)
              requirements.append(line)
      return requirements
docs: Read wheel metadata to know what it depends on.
  
      The `run_requires` attribute contains a list of dict or str specifying
      requirements. For dicts, it may contain an "extra" key to specify these
      requirements are for a specific extra. Unfortunately, not all fields are
      specificed like this (I don't know why); some are specified with markers.
      So we jump though these terrible hoops to know exactly what we need.
  
      The extra extraction is not comprehensive. Tt assumes the marker is NEVER
      something like `extra == "foo" and extra == "bar"`. I guess this never
      makes sense anyway? Markers are just terrible.