<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def addFeature(self, f, conflict="error", missing="other"):
 """ Add a feature. Args: - f(Feature):
 feature to add. - conflict(str):
 if a property hasn't compatible values/constrains, do: - ``"error"``: raise exception. - ``"ignore"``: go on. - ``"me"``: keep the old value. - ``"other"``: set the passed value. - missing(str):
 if a property has not been set yet, do: - ``"error"``: raise exception. - ``"ignore"``: do nothning. - ``"me"``: do nothing. - ``"other"``: set the passed value. """


        OPTIONS = ["error", "ignore", "me", "other"]
        assert missing in OPTIONS, "Invalid value in `missing`."
        assert conflict in OPTIONS, "Invalid value in `missing`."

        if f.prop not in self.props and missing == "error":
            raise Exception("Property has not set.")
        elif f.prop not in self.props and missing in ["ignore", "first"]:
            return

        if isinstance(f.value, int) or isinstance(f.value, float):
            if f.operator == "=":
                inter1 = (f, f)
            elif f.operator[0] == "<":
                inter1 = (None, f)
            elif f.operator[0] == ">":
                inter1 = (f, None)
            inter0 = self.props.get(f.prop, (None, None))
            try:
                self.props[f.prop] = Features._applyInter(inter0, inter1, conflict)
            except Exception as e:
                raise RADLParseException("%s. Involved features: %s" % (e, [str(f0) for f0 in inter0]),
                                         line=f.line)
        elif isinstance(f, SoftFeatures):
            self.props.setdefault(f.prop, []).append(f)
        elif f.operator == "contains":
            if f.prop in self.props and f.value.getValue("name") in self.props[f.prop]:
                feature = self.props[f.prop][f.value.getValue("name")].clone()
                for f0 in f.value.features:
                    feature.value.addFeature(f0, conflict, missing)
                self.props[f.prop][f.value.getValue("name")] = feature
            else:
                self.props.setdefault(f.prop, {})[f.value.getValue("name")] = f
        else:
            value0 = self.props.get(f.prop, None)
            if not value0 or (conflict == "other"):
                self.props[f.prop] = f
            elif value0.value != f.value and conflict == "error":
                raise RADLParseException("Conflict adding `%s` because `%s` is already set and conflict is"
                                         " %s" % (f, value0, conflict), line=f.line)