Skip to content

Commit fb16d9d

Browse files
committed
Add sugar for the params
1 parent ae5e3c5 commit fb16d9d

3 files changed

Lines changed: 45 additions & 11 deletions

File tree

spec-draft.rst

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,18 @@ Extended Callables, take 2
2424

2525
We introduce a ``Param`` type the contains all the information about a function param::
2626

27-
class Param[N: str | None, T, Q: ParamQuals = typing.Never]:
28-
pass
27+
class Param[N: str | None, T, Q: ParamQuals = typing.Never]:
28+
pass
29+
30+
ParamQuals = typing.Literal["*", "**", "default", "keyword"]
2931

30-
ParamQuals = typing.Literal["*", "**", "default", "keyword"]
32+
type PosParam[T] = Param[Literal[None], T]
33+
type PosDefaultParam[T] = Param[Literal[None], T, Literal["default"]]
34+
type DefaultParam[N: str, T] = Param[N, T, Literal["default"]]
35+
type NamedParam[N: str, T] = Param[N, T, Literal["keyword"]]
36+
type NamedDefaultParam[N: str, T] = Param[N, T, Literal["keyword", "default"]]
37+
type ArgsParam[T] = Param[Literal[None], T, Literal["*"]]
38+
type KwargsParam[T] = Param[Literal[None], T, Literal["**"]]
3139

3240
And then, we can represent the type of a function like::
3341

@@ -59,6 +67,21 @@ as (we are omiting the ``Literal`` in places)::
5967
]
6068

6169

70+
or, using the type abbreviations we provide::
71+
72+
Callable[
73+
[
74+
PosParam[int],
75+
Param["b", int],
76+
DefaultParam["c", int,
77+
ArgsParam[int, "*"],
78+
NamedParam["d", int],
79+
NamedDefaultParam["e", int],
80+
KwargsParam[int],
81+
],
82+
int,
83+
]
84+
6285
Rationale
6386
'''''''''
6487
We need extended callable support, in order to inspect and produce callables via type-level computation. mypy supports `extended callables <https://mypy.readthedocs.io/en/stable/additional_features.html#extended-callable-types>`__ but they are deprecated in favor of callback protocols.

tests/test_schemalike.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
GetType,
1111
GetName,
1212
Member,
13+
NamedParam,
1314
Param,
1415
StrConcat,
1516
)
@@ -49,7 +50,7 @@ class Property:
4950
Callable[
5051
[
5152
Param[Literal["self"], Schemaify[T]],
52-
Param[Literal["schema"], Schema, Literal["keyword"]],
53+
NamedParam[Literal["schema"], Schema, Literal["keyword"]],
5354
],
5455
GetType[p],
5556
],

typemap/typing.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import contextvars
22
import typing
3+
from typing import Literal
34
from typing import _GenericAlias # type: ignore
45

56
_SpecialForm: typing.Any = typing._SpecialForm
@@ -74,7 +75,7 @@ class DropAnnotations[T]:
7475
###
7576

7677

77-
MemberQuals = typing.Literal["ClassVar", "Final"]
78+
MemberQuals = Literal["ClassVar", "Final"]
7879

7980

8081
class Member[
@@ -91,7 +92,7 @@ class Member[
9192
definer: D
9293

9394

94-
ParamQuals = typing.Literal["*", "**", "="]
95+
ParamQuals = Literal["*", "**", "keyword", "default"]
9596

9697

9798
class Param[N: str | None, T, Q: ParamQuals = typing.Never]:
@@ -100,11 +101,20 @@ class Param[N: str | None, T, Q: ParamQuals = typing.Never]:
100101
quals: Q
101102

102103

103-
type GetName[T: Member | Param] = GetAttr[T, typing.Literal["name"]]
104-
type GetType[T: Member | Param] = GetAttr[T, typing.Literal["typ"]]
105-
type GetQuals[T: Member | Param] = GetAttr[T, typing.Literal["quals"]]
106-
type GetInit[T: Member] = GetAttr[T, typing.Literal["init"]]
107-
type GetDefiner[T: Member] = GetAttr[T, typing.Literal["definer"]]
104+
type PosParam[T] = Param[Literal[None], T]
105+
type PosDefaultParam[T] = Param[Literal[None], T, Literal["default"]]
106+
type DefaultParam[N: str, T] = Param[N, T, Literal["default"]]
107+
type NamedParam[N: str, T] = Param[N, T, Literal["keyword"]]
108+
type NamedDefaultParam[N: str, T] = Param[N, T, Literal["keyword", "default"]]
109+
type ArgsParam[T] = Param[Literal[None], T, Literal["*"]]
110+
type KwargsParam[T] = Param[Literal[None], T, Literal["**"]]
111+
112+
113+
type GetName[T: Member | Param] = GetAttr[T, Literal["name"]]
114+
type GetType[T: Member | Param] = GetAttr[T, Literal["typ"]]
115+
type GetQuals[T: Member | Param] = GetAttr[T, Literal["quals"]]
116+
type GetInit[T: Member] = GetAttr[T, Literal["init"]]
117+
type GetDefiner[T: Member] = GetAttr[T, Literal["definer"]]
108118

109119

110120
class Attrs[T]:

0 commit comments

Comments
 (0)