Use a Enum class as model for the data type description. Note that if no default-value is provided, the first enum-value is used as default-value. .. sourcecode:: python # -- SINCE: Python 3.4 (or install backport: pip install enum34) import enum from traitlets
| 4209 | |
| 4210 | |
| 4211 | class UseEnum(TraitType[t.Any, t.Any]): |
| 4212 | """Use a Enum class as model for the data type description. |
| 4213 | Note that if no default-value is provided, the first enum-value is used |
| 4214 | as default-value. |
| 4215 | |
| 4216 | .. sourcecode:: python |
| 4217 | |
| 4218 | # -- SINCE: Python 3.4 (or install backport: pip install enum34) |
| 4219 | import enum |
| 4220 | from traitlets import HasTraits, UseEnum |
| 4221 | |
| 4222 | |
| 4223 | class Color(enum.Enum): |
| 4224 | red = 1 # -- IMPLICIT: default_value |
| 4225 | blue = 2 |
| 4226 | green = 3 |
| 4227 | |
| 4228 | |
| 4229 | class MyEntity(HasTraits): |
| 4230 | color = UseEnum(Color, default_value=Color.blue) |
| 4231 | |
| 4232 | |
| 4233 | entity = MyEntity(color=Color.red) |
| 4234 | entity.color = Color.green # USE: Enum-value (preferred) |
| 4235 | entity.color = "green" # USE: name (as string) |
| 4236 | entity.color = "Color.green" # USE: scoped-name (as string) |
| 4237 | entity.color = 3 # USE: number (as int) |
| 4238 | assert entity.color is Color.green |
| 4239 | """ |
| 4240 | |
| 4241 | default_value: enum.Enum | None = None |
| 4242 | info_text = "Trait type adapter to a Enum class" |
| 4243 | |
| 4244 | def __init__( |
| 4245 | self, enum_class: type[t.Any], default_value: t.Any = None, **kwargs: t.Any |
| 4246 | ) -> None: |
| 4247 | assert issubclass(enum_class, enum.Enum), "REQUIRE: enum.Enum, but was: %r" % enum_class |
| 4248 | allow_none = kwargs.get("allow_none", False) |
| 4249 | if default_value is None and not allow_none: |
| 4250 | default_value = next(iter(enum_class.__members__.values())) |
| 4251 | super().__init__(default_value=default_value, **kwargs) |
| 4252 | self.enum_class = enum_class |
| 4253 | self.name_prefix = enum_class.__name__ + "." |
| 4254 | |
| 4255 | def select_by_number(self, value: int, default: t.Any = Undefined) -> t.Any: |
| 4256 | """Selects enum-value by using its number-constant.""" |
| 4257 | assert isinstance(value, int) |
| 4258 | enum_members = self.enum_class.__members__ |
| 4259 | for enum_item in enum_members.values(): |
| 4260 | if enum_item.value == value: |
| 4261 | return enum_item |
| 4262 | # -- NOT FOUND: |
| 4263 | return default |
| 4264 | |
| 4265 | def select_by_name(self, value: str, default: t.Any = Undefined) -> t.Any: |
| 4266 | """Selects enum-value by using its name or scoped-name.""" |
| 4267 | assert isinstance(value, str) |
| 4268 | if value.startswith(self.name_prefix): |
no outgoing calls
searching dependent graphs…