Skip to content

FlowMutator parameter conflicts in multi-level inheritance #2678

@ShantanuKumar

Description

@ShantanuKumar

When using FlowMutator to add parameters to a base flow class with multi-level inheritance (grandchild classes), Metaflow throws an error indicating that the parameter already exists, even though it was added by the mutator on a parent class.

Error Message

Metaflow 2.19.5 executing FlowGrandChild for user:skumar
    Flow failed:
    Flow 'FlowGrandChild' already has a class member 'triggered_by' -- set overwrite=True in add_parameter to overwrite it.

Environment

  • Metaflow Version: 2.19.5
  • Python Version: 3.11.10

Reproduction Steps

Run this code

from metaflow import (
    FlowMutator,
    Parameter,
    FlowSpec,
    step,
)
from metaflow.user_decorators.mutable_flow import MutableFlow

class TriggeredByParameter(FlowMutator):

    def pre_mutate(self, mutable_flow: MutableFlow):

        mutable_flow.add_parameter(
            "triggered_by",
            Parameter(
                "triggered_by",
                default="ci-cd",
                type=str,
                help="Username of the user triggering the flow",
            ),
        )

@TriggeredByParameter()
class BaseFlow(FlowSpec):

    def dummy_method(self):
        pass

class BaseFlowChild(BaseFlow):

    def child_method(self):
        pass

class FlowGrandChild(BaseFlowChild):
    """Final Flow."""

    msg: str = Parameter(  # type: ignore
        "msg",
        type=str,
        help="Error message to log",
    )

    @step
    def start(self):
        print("BaseFlowError:", self.msg)
        self.next(self.end)

    @step
    def end(self):
        pass

if __name__ == "__main__":
    FlowGrandChild()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions