Skip to content

[event trigger decorator] multi-events passing via config_expr crashes with TypeError #3080

@valayDave

Description

@valayDave

The below flow is a simple example to verify that reproduces the crash when values to events parameters is set via config_expr in the @trigger decorator.

"""
Test: Does @trigger(events=config_expr(...)) crash due to ConfigValue immutability?

This reproduces the bug where events_decorator.py tries to mutate a ConfigValue dict:
    event["parameters"] = self.process_parameters(...)
    -> TypeError: ConfigValue is immutable

Run:
    # Should FAIL (multi-event, list-of-dicts config value):
    python test_config_value_immutability.py --config-value config '{"project_name":"test","trigger_events":[{"name":"evt_a","parameters":{"my_param":"my_param"}},{"name":"evt_b"}]}' show
"""
from metaflow import FlowSpec, step, Parameter, Config, config_expr, project, trigger


@project(name=config_expr("config.project_name"))
@trigger(events=config_expr("config.trigger_events"))
class MultiEventConfigTest(FlowSpec):
    config = Config(
        "config",
        default_value={
            "project_name": "test",
            "trigger_events": [
                {
                    "name": "evt_a",
                    "parameters": {"my_param": "my_param"},
                },
                {"name": "evt_b"},
            ],
        },
    )

    my_param = Parameter("my_param", default="", type=str)

    @step
    def start(self):
        print(f"my_param={self.my_param}")
        self.next(self.end)

    @step
    def end(self):
        print("done")


if __name__ == "__main__":
    MultiEventConfigTest()

The error:

  Traceback (most recent call last):
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/cli.py", line 727, in main
         start(auto_envvar_prefix="METAFLOW", obj=state)
         ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/_vendor/click/core.py", line 829, in __call__
         return self.main(args, kwargs)
                ~~~~~~~~~^^^^^^^^^^^^^^^^^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/_vendor/click/core.py", line 782, in main
         rv = self.invoke(ctx)
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/cli_components/utils.py", line 65, in invoke
         click.Command.invoke(self, ctx)
         ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/_vendor/click/core.py", line 1066, in invoke
         return ctx.invoke(self.callback, ctx.params)
                ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/_vendor/click/core.py", line 610, in invoke
         return callback(args, kwargs)
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/_vendor/click/decorators.py", line 21, in new_func
         return f(get_current_context(), args, kwargs)
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/cli.py", line 568, in start
         decorators._init_flow_decorators(
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
             ctx.obj.flow,
             ^^^^^^^^^^^^^
         ...<8 lines>...
             ctx.obj.skip_decorators,
             ^^^^^^^^^^^^^^^^^^^^^^^^
         )
         ^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/decorators.py", line 788, in _init_flow_decorators
         deco.flow_init(
         ~~~~~~~~~~~~~~^
             flow,
             ^^^^^
         ...<6 lines>...
             deco_flow_init_options,
             ^^^^^^^^^^^^^^^^^^^^^^^
         )
         ^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/plugins/events_decorator.py", line 236, in flow_init
         processed_event = self.process_event(event)
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/plugins/events_decorator.py", line 122, in process_event
         event["parameters"] = self.process_parameters(
         ~~~~~^^^^^^^^^^^^^^
       File "/home/ubuntu/miniconda3/envs/ob-lambdas/lib/python3.13/site-packages/metaflow/user_configs/config_parameters.py", line 190, in __setitem__
         raise TypeError("ConfigValue is immutable")
     TypeError: ConfigValue is immutable

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