@@ -393,18 +393,32 @@ Extended Callables, take 2
393393
394394We introduce a ``Param `` type the contains all the information about a function param::
395395
396- class Param[N: str | None, T, Q: ParamQuals = typing.Never]:
396+ class ParamKind(enum.IntEnum):
397+ """Parameter kind qualifiers, modeled on inspect._ParameterKind."""
398+ POSITIONAL_ONLY = 0
399+ POSITIONAL_OR_KEYWORD = 1
400+ VAR_POSITIONAL = 2
401+ KEYWORD_ONLY = 3
402+ VAR_KEYWORD = 4
403+
404+ class Param[N: str | None, T, Q: ParamKind = typing.Never, D = typing.Never]:
397405 pass
398406
399- ParamQuals = typing.Literal["*", "**", "default", "keyword"]
400-
401- type PosParam[N: str | None, T] = Param[N, T, Literal["positional"]]
402- type PosDefaultParam[N: str | None, T] = Param[N, T, Literal["positional", "default"]]
403- type DefaultParam[N: str, T] = Param[N, T, Literal["default"]]
404- type NamedParam[N: str, T] = Param[N, T, Literal["keyword"]]
405- type NamedDefaultParam[N: str, T] = Param[N, T, Literal["keyword", "default"]]
406- type ArgsParam[T] = Param[Literal[None], T, Literal["*"]]
407- type KwargsParam[T] = Param[Literal[None], T, Literal["**"]]
407+ type PosParam[N: str | None, T] = Param[
408+ N, T, Literal[ParamKind.POSITIONAL_ONLY]
409+ ]
410+ type PosDefaultParam[N: str | None, T] = Param[
411+ N, T, Literal[ParamKind.POSITIONAL_ONLY], T
412+ ]
413+ type DefaultParam[N: str, T] = Param[
414+ N, T, Literal[ParamKind.POSITIONAL_OR_KEYWORD], T
415+ ]
416+ type NamedParam[N: str, T] = Param[N, T, Literal[ParamKind.KEYWORD_ONLY]]
417+ type NamedDefaultParam[N: str, T] = Param[
418+ N, T, Literal[ParamKind.KEYWORD_ONLY], T
419+ ]
420+ type ArgsParam[T] = Param[Literal[None], T, Literal[ParamKind.VAR_POSITIONAL]]
421+ type KwargsParam[T] = Param[Literal[None], T, Literal[ParamKind.VAR_KEYWORD]]
408422
409423And then, we can represent the type of a function like::
410424
@@ -424,13 +438,13 @@ as (we are omitting the ``Literal`` in places)::
424438
425439 Callable[
426440 [
427- Param["a", int, "positional" ],
441+ Param["a", int, ParamKind.POSITIONAL_ONLY ],
428442 Param["b", int],
429- Param["c", int, "default" ],
430- Param[None, int, "*" ],
431- Param["d", int, "keyword" ],
432- Param["e", int, Literal["default", "keyword"] ],
433- Param[None, int, "**" ],
443+ Param["c", int, ParamKind.POSITIONAL_OR_KEYWORD, int ],
444+ Param[None, int, ParamKind.VAR_POSITIONAL ],
445+ Param["d", int, ParamKind.KEYWORD_ONLY ],
446+ Param["e", int, ParamKind.KEYWORD_ONLY, int ],
447+ Param[None, int, ParamKind.VAR_KEYWORD ],
434448 ],
435449 int,
436450 ]
@@ -442,10 +456,10 @@ or, using the type abbreviations we provide::
442456 [
443457 PosParam["a", int],
444458 Param["b", int],
445- DefaultParam["c", int],
459+ DefaultParam["c", int], # D=int
446460 ArgsParam[int],
447461 NamedParam["d", int],
448- NamedDefaultParam["e", int],
462+ NamedDefaultParam["e", int], # D=int
449463 KwargsParam[int],
450464 ],
451465 int,
@@ -1129,13 +1143,14 @@ dataclasses-style method generation
11291143 typing.GetName[p],
11301144 typing.GetType[p],
11311145 # All arguments are keyword-only
1146+ Literal[typing.ParamKind.KEYWORD_ONLY],
11321147 # It takes a default if a default is specified in the class
1133- Literal["keyword" ]
1134- if typing.IsAssignable[
1148+ typing.GetType[p ]
1149+ if not typing.IsAssignable[
11351150 GetDefault[typing.GetInit[p]],
11361151 Never,
11371152 ]
1138- else Literal["keyword", "default"] ,
1153+ else Never ,
11391154 ]
11401155 for p in typing.Iter[typing.Attrs[T]]
11411156 ],
0 commit comments