-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Specify the name of a single changed signal in EventedModel #261
Comments
I managed to make it work with a custom from typing import ClassVar
from attrs import define, field
from psygnal import SignalGroupDescriptor, Signal, SignalGroup, EmissionInfo
ModelSignalGroup = type("ModelSignalGroup", (SignalGroup,), {"name": Signal(str, str)})
@define
class Model:
events: ClassVar[ModelSignalGroup] = SignalGroupDescriptor(
signal_group_class= ModelSignalGroup,
)
_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 to ('ctt_1', 'c') |
It works with sub-classing, although I have to redefine the |
see #262 and #260 (comment) for another option. |
This can be closed, with #299 merged, it can be done in two ways (that are not exactly equivalent). With aliases only: from typing import ClassVar
from attrs import define, field
from psygnal import SignalGroupDescriptor, EmissionInfo
aliases = {"_name": "name", "name": None, "_controller": None}
@define
class Model:
events: ClassVar[SignalGroupDescriptor] = SignalGroupDescriptor(signal_aliases=aliases)
_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 to ('ctt_1', 'c') With aliases and a from typing import ClassVar
from attrs import define, field
from psygnal import SignalGroupDescriptor, Signal, SignalGroup, EmissionInfo
ModelSignalGroup = type("ModelSignalGroup", (SignalGroup,), {"name": Signal(str, str)})
@define
class Model:
events: ClassVar[ModelSignalGroup] = SignalGroupDescriptor(
signal_group_class= ModelSignalGroup,
signal_aliases={"_name": None, "_controller": None}
)
_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 to ('ctt_1', 'c') |
My problem, I am using
attrs
to make a dataclass with aname
attribute.I want to modify the
name
before setting it, but I cannot useattrs.converters
because they arenot bound to the instance. So I create a private
_name
field and use aname
property to validate the namebefore 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 beself.events.name_changed
orself.events.name
, i.e. without the "_" prefix because then I will add other signals likeself.events.color
and I want it to be consistent, so all without the "_" prefix.Any idea how I can do that without another PR :) ?
The text was updated successfully, but these errors were encountered: