@@ -393,18 +393,31 @@ 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+ HAS_DEFAULT = 5
404+
405+ class Param[N: str | None, T, Q: ParamKind = typing.Never]:
397406 pass
398407
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["**"]]
408+ type PosParam[N: str | None, T] = Param[
409+ N, T, Literal[ParamKind.POSITIONAL_ONLY]
410+ ]
411+ type PosDefaultParam[N: str | None, T] = Param[
412+ N, T, Literal[ParamKind.POSITIONAL_ONLY, ParamKind.HAS_DEFAULT]
413+ ]
414+ type DefaultParam[N: str, T] = Param[N, T, Literal[ParamKind.HAS_DEFAULT]]
415+ type NamedParam[N: str, T] = Param[N, T, Literal[ParamKind.KEYWORD_ONLY]]
416+ type NamedDefaultParam[N: str, T] = Param[
417+ N, T, Literal[ParamKind.KEYWORD_ONLY, ParamKind.HAS_DEFAULT]
418+ ]
419+ type ArgsParam[T] = Param[Literal[None], T, Literal[ParamKind.VAR_POSITIONAL]]
420+ type KwargsParam[T] = Param[Literal[None], T, Literal[ParamKind.VAR_KEYWORD]]
408421
409422And then, we can represent the type of a function like::
410423
@@ -424,13 +437,13 @@ as (we are omitting the ``Literal`` in places)::
424437
425438 Callable[
426439 [
427- Param["a", int, "positional" ],
440+ Param["a", int, ParamKind.POSITIONAL_ONLY ],
428441 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, "**" ],
442+ Param["c", int, ParamKind.HAS_DEFAULT ],
443+ Param[None, int, ParamKind.VAR_POSITIONAL ],
444+ Param["d", int, ParamKind.KEYWORD_ONLY ],
445+ Param["e", int, Literal[ParamKind.HAS_DEFAULT, ParamKind.KEYWORD_ONLY ]],
446+ Param[None, int, ParamKind.VAR_KEYWORD ],
434447 ],
435448 int,
436449 ]
@@ -1130,12 +1143,12 @@ dataclasses-style method generation
11301143 typing.GetType[p],
11311144 # All arguments are keyword-only
11321145 # It takes a default if a default is specified in the class
1133- Literal["keyword" ]
1146+ Literal[typing.ParamKind.KEYWORD_ONLY ]
11341147 if typing.IsAssignable[
11351148 GetDefault[typing.GetInit[p]],
11361149 Never,
11371150 ]
1138- else Literal["keyword", "default" ],
1151+ else Literal[typing.ParamKind.KEYWORD_ONLY, typing.ParamKind.HAS_DEFAULT ],
11391152 ]
11401153 for p in typing.Iter[typing.Attrs[T]]
11411154 ],
0 commit comments