Skip to content

Specify the name of a single changed signal in EventedModel #261

@getzze

Description

@getzze

My problem, I am using attrs to make a dataclass with a name attribute.
I want to modify the name before setting it, but I cannot use attrs.converters because they are
not bound to the instance. So I create a private _name field and use a name property to validate the name
before setting it.
Now I would like to emit a signal when name is changed. This is my working example using PR #260.

Now the signal is emitted at self.events._name_changed but I would like it to be self.events.name_changed or self.events.name, i.e. without the "_" prefix because then I will add other signals like self.events.color and I want it to be consistent, so all without the "_" prefix.

Any idea how I can do that without another PR :) ?

from typing import ClassVar
from attrs import define, field
from psygnal import SignalGroupDescriptor, EmissionInfo


@define
class Model:
    events: ClassVar[SignalGroupDescriptor] = SignalGroupDescriptor(signal_suffix="_changed")

    _controller: str = field()
    _name: str = field(kw_only=True)

    @property
    def name(self) -> str:
        return self._name

    @name.setter
    def name(self, value: str) -> None:
        # Generate a unique name among siblings
        siblings = [self.controller]
        value = f"{value}_1" if value in siblings else value
        self._name = value

    @property
    def controller(self) -> str:
        return self._controller

m = Model("ctt", name="c")
@m.events.connect
def on_any_change(info: EmissionInfo):
    print(f"field {info.signal.name!r} changed to {info.args}")

m.name = "ctt"; m.name
# >> field '_name_changed' changed to ('ctt_1', 'c')
# I would like it to be 'name_changed'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions