Skip to content

Commit ecfcc79

Browse files
author
Alan
committed
Make Set, Tuple, and UseEnum generic.
1 parent e3d5c5a commit ecfcc79

File tree

2 files changed

+21
-24
lines changed

2 files changed

+21
-24
lines changed

tests/test_typing.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -249,16 +249,15 @@ class T(HasTraits):
249249
@pytest.mark.mypy_testing
250250
def mypy_set_typing() -> None:
251251
class T(HasTraits):
252-
remove_cell_tags = Set(
252+
remove_cell_tags: Set[str] = Set(
253253
Unicode(),
254254
default_value=[],
255255
help=(
256-
"Tags indicating which cells are to be removed,"
257-
"matches tags in ``cell.metadata.tags``."
256+
"Tags indicating which cells are to be removed,matches tags in ``cell.metadata.tags``."
258257
),
259258
).tag(config=True)
260259

261-
safe_output_keys = Set(
260+
safe_output_keys: Set[t.Any] = Set(
262261
config=True,
263262
default_value={
264263
"metadata", # Not a mimetype per-se, but expected and safe.
@@ -272,13 +271,13 @@ class T(HasTraits):
272271
)
273272

274273
t = T()
275-
reveal_type(Set("foo")) # R: traitlets.traitlets.Set
276-
reveal_type(Set("").tag(sync=True)) # R: traitlets.traitlets.Set
277-
reveal_type(Set(None, allow_none=True)) # R: traitlets.traitlets.Set
278-
reveal_type(Set(None, allow_none=True).tag(sync=True)) # R: traitlets.traitlets.Set
279-
reveal_type(T.remove_cell_tags) # R: traitlets.traitlets.Set
280-
reveal_type(t.remove_cell_tags) # R: builtins.set[Any]
281-
reveal_type(T.safe_output_keys) # R: traitlets.traitlets.Set
274+
reveal_type(Set({"foo"})) # R: traitlets.traitlets.Set[builtins.str]
275+
reveal_type(Set({""}).tag(sync=True)) # R: traitlets.traitlets.Set[builtins.str]
276+
reveal_type(Set(None, allow_none=True)) # R: traitlets.traitlets.Set[Never]
277+
reveal_type(Set(None, allow_none=True).tag(sync=True)) # R: traitlets.traitlets.Set[Never]
278+
reveal_type(T.remove_cell_tags) # R: traitlets.traitlets.Set[builtins.str]
279+
reveal_type(t.remove_cell_tags) # R: builtins.set[builtins.str]
280+
reveal_type(T.safe_output_keys) # R: traitlets.traitlets.Set[Any]
282281
reveal_type(t.safe_output_keys) # R: builtins.set[Any]
283282

284283

traitlets/traitlets.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ class TraitType(BaseDescriptor, t.Generic[G, S]):
519519
default_value: t.Any = Undefined
520520

521521
def __init__(
522-
self: TraitType[G, S],
522+
self,
523523
default_value: t.Any = Undefined,
524524
allow_none: bool = False,
525525
read_only: bool | None = None,
@@ -3580,7 +3580,7 @@ def item_from_string(self, s: str, index: int | None = None) -> T | str:
35803580
return s
35813581

35823582

3583-
class List(Container[t.List[T]]):
3583+
class List(Container[t.List[T]], t.Generic[T]):
35843584
"""An instance of a Python list."""
35853585

35863586
klass = list # type:ignore[assignment]
@@ -3645,7 +3645,7 @@ def set(self, obj: t.Any, value: t.Any) -> None:
36453645
return super().set(obj, value)
36463646

36473647

3648-
class Set(Container[t.Set[t.Any]]):
3648+
class Set(Container[t.Set[T]], t.Generic[T]):
36493649
"""An instance of a Python set."""
36503650

36513651
klass = set
@@ -3656,8 +3656,8 @@ class Set(Container[t.Set[t.Any]]):
36563656
# Redefine __init__ just to make the docstring more accurate.
36573657
def __init__(
36583658
self,
3659-
trait: t.Any = None,
3660-
default_value: t.Any = Undefined,
3659+
trait: TraitType[T, t.Any] | t.Iterable[T] | None = None,
3660+
default_value: set[T] | t.Any = Undefined,
36613661
minlen: int = 0,
36623662
maxlen: int = sys.maxsize,
36633663
**kwargs: t.Any,
@@ -3720,13 +3720,13 @@ def default_value_repr(self) -> str:
37203720
return "{" + list_repr[1:-1] + "}"
37213721

37223722

3723-
class Tuple(Container[t.Tuple[t.Any, ...]]):
3723+
class Tuple(Container[t.Tuple[T]], t.Generic[T]):
37243724
"""An instance of a Python tuple."""
37253725

37263726
klass = tuple
37273727
_cast_types = (list,)
37283728

3729-
def __init__(self, *traits: t.Any, **kwargs: t.Any) -> None:
3729+
def __init__(self, *traits: T, **kwargs: t.Any) -> None:
37303730
"""Create a tuple from a list, set, or tuple.
37313731
37323732
Create a fixed-type tuple with Traits:
@@ -3869,9 +3869,9 @@ class Dict(Instance["dict[K, V]"]):
38693869

38703870
def __init__(
38713871
self,
3872-
value_trait: TraitType[t.Any, t.Any] | dict[K, V] | Sentinel | None = None,
3872+
value_trait: TraitType[V, t.Any] | dict[K, V] | Sentinel | None = None,
38733873
per_key_traits: t.Any = None,
3874-
key_trait: TraitType[t.Any, t.Any] | None = None,
3874+
key_trait: TraitType[K, t.Any] | None = None,
38753875
default_value: dict[K, V] | Sentinel | None = Undefined,
38763876
**kwargs: t.Any,
38773877
) -> None:
@@ -4203,7 +4203,7 @@ def validate(self, obj: t.Any, value: t.Any) -> re.Pattern[t.Any] | None:
42034203
self.error(obj, value)
42044204

42054205

4206-
class UseEnum(TraitType[t.Any, t.Any]):
4206+
class UseEnum(TraitType[G, S], t.Generic[G, S]):
42074207
"""Use a Enum class as model for the data type description.
42084208
Note that if no default-value is provided, the first enum-value is used
42094209
as default-value.
@@ -4236,9 +4236,7 @@ class MyEntity(HasTraits):
42364236
default_value: enum.Enum | None = None
42374237
info_text = "Trait type adapter to a Enum class"
42384238

4239-
def __init__(
4240-
self, enum_class: type[t.Any], default_value: t.Any = None, **kwargs: t.Any
4241-
) -> None:
4239+
def __init__(self, enum_class: type[G], default_value: t.Any = None, **kwargs: t.Any) -> None:
42424240
assert issubclass(enum_class, enum.Enum), "REQUIRE: enum.Enum, but was: %r" % enum_class
42434241
allow_none = kwargs.get("allow_none", False)
42444242
if default_value is None and not allow_none:

0 commit comments

Comments
 (0)