<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def from_known_inputs(cls, logs=None, metric_names=None, label_names=None):
 """An alternate constructor that assumes known metrics and labels. This differs from the default constructor in that the metrics and labels are iterables of names of 'known' metrics and labels respectively. The names are used to obtain the metrics and labels from :class:`endpoints_management.control.metric_descriptor.KnownMetrics` and :class:`endpoints_management.control.label_descriptor.KnownLabels` respectively. names that don't correspond to a known metric or label are ignored; as are metrics or labels that don't yet have a way of updating the `ReportRequest` operation. Args: logs (iterable[string]):
 the name of logs to be included in the `ReportRequest` metric_names (iterable[string]):
 the name of a known metric to be added to the `ReportRequest` label_names (iterable[string]):
 the name of a known label to be added to the `ReportRequest` """

        if not metric_names:
            metric_names = ()
        if not label_names:
            label_names = ()
        known_labels = []
        known_metrics = []
        # pylint: disable=no-member
        # pylint is not aware of the __members__ attributes
        for l in label_descriptor.KnownLabels.__members__.values():
            if l.update_label_func and l.label_name in label_names:
                known_labels.append(l)
        for m in metric_descriptor.KnownMetrics.__members__.values():
            if m.update_op_func and m.metric_name in metric_names:
                known_metrics.append(m)
        return cls(logs=logs, metrics=known_metrics, labels=known_labels)