Skip to content

Commit 746225d

Browse files
committed
Default Param Q to Literal[ParamKind.POSITIONAL_OR_KEYWORD]
Replace the typing.Never default with the explicit POSITIONAL_OR_KEYWORD kind, and always emit a kind qualifier in _function_type.
1 parent 48bd3af commit 746225d

4 files changed

Lines changed: 26 additions & 24 deletions

File tree

tests/test_type_dir.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -373,12 +373,13 @@ def test_type_members_func_1():
373373
assert name == typing.Literal["foo"]
374374
assert quals == typing.Literal["ClassVar"]
375375

376+
PK = "typing.Literal[<ParamKind.POSITIONAL_OR_KEYWORD: 1>]"
376377
assert (
377378
str(typ)
378-
== "\
379+
== f"\
379380
typing.Callable[[\
380-
typemap.typing.Param[typing.Literal['self'], tests.test_type_dir.Base[int], typing.Never], \
381-
typemap.typing.Param[typing.Literal['a'], int | None, typing.Never], \
381+
typemap.typing.Param[typing.Literal['self'], tests.test_type_dir.Base[int], {PK}], \
382+
typemap.typing.Param[typing.Literal['a'], int | None, {PK}], \
382383
typemap.typing.Param[typing.Literal['b'], int, typing.Literal[\
383384
<ParamKind.KEYWORD_ONLY: 3>, <ParamKind.HAS_DEFAULT: 5>]]], \
384385
dict[str, int]]"
@@ -395,10 +396,11 @@ def test_type_members_func_2():
395396
assert name == typing.Literal["cbase"]
396397
assert quals == typing.Literal["ClassVar"]
397398

399+
PK = "typing.Literal[<ParamKind.POSITIONAL_OR_KEYWORD: 1>]"
398400
assert (
399401
str(typ)
400-
== "\
401-
classmethod[tests.test_type_dir.Base[int], tuple[typemap.typing.Param[typing.Literal['a'], int | None, typing.Never], typemap.typing.Param[typing.Literal['b'], ~K, typing.Never]], dict[str, int]]"
402+
== f"\
403+
classmethod[tests.test_type_dir.Base[int], tuple[typemap.typing.Param[typing.Literal['a'], int | None, {PK}], typemap.typing.Param[typing.Literal['b'], ~K, {PK}]], dict[str, int]]"
402404
)
403405

404406

@@ -410,12 +412,11 @@ def test_type_members_func_3():
410412
assert name == typing.Literal["sbase"]
411413
assert quals == typing.Literal["ClassVar"]
412414

415+
PK = "typing.Literal[<ParamKind.POSITIONAL_OR_KEYWORD: 1>]"
413416
assert (
414417
str(typ)
415-
# == "\
416-
# staticmethod[tuple[typemap.typing.Param[typing.Literal['a'], int | typing.Literal['gotcha!'] | Z | None, typing.Never], typemap.typing.Param[typing.Literal['b'], ~K, typing.Never]], dict[str, int | Z]]"
417-
== "\
418-
typemap.typing.GenericCallable[tuple[Z], staticmethod[tuple[typemap.typing.Param[typing.Literal['a'], int | typing.Literal['gotcha!'] | Z | None, typing.Never], typemap.typing.Param[typing.Literal['b'], ~K, typing.Never]], dict[str, int | Z]]]"
418+
== f"\
419+
typemap.typing.GenericCallable[tuple[Z], staticmethod[tuple[typemap.typing.Param[typing.Literal['a'], int | typing.Literal['gotcha!'] | Z | None, {PK}], typemap.typing.Param[typing.Literal['b'], ~K, {PK}]], dict[str, int | Z]]]"
419420
)
420421

421422

tests/test_type_eval.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -450,16 +450,11 @@ def test_eval_getarg_callable_old():
450450
def test_eval_getarg_callable_01():
451451
t = Callable[[int, str], str]
452452
args = eval_typing(GetArg[t, Callable, Literal[0]])
453-
assert (
454-
args
455-
== tuple[
456-
Param[Literal[None], int, Never], Param[Literal[None], str, Never]
457-
]
458-
)
453+
assert args == tuple[Param[Literal[None], int], Param[Literal[None], str]]
459454

460455
t = Callable[int, str]
461456
args = eval_typing(GetArg[t, Callable, Literal[0]])
462-
assert args == tuple[Param[Literal[None], int, Never]]
457+
assert args == tuple[Param[Literal[None], int]]
463458

464459
t = Callable[[], str]
465460
args = eval_typing(GetArg[t, Callable, Literal[0]])
@@ -491,7 +486,7 @@ def test_eval_getarg_callable_02():
491486
gc_f = eval_typing(GetArg[gc, GenericCallable, Literal[1]])
492487
assert gc_f == f
493488
t = eval_typing(GetArg[gc_f, Callable, Literal[0]])
494-
assert t == tuple[Param[Literal[None], T, Never]]
489+
assert t == tuple[Param[Literal[None], T]]
495490
t = eval_typing(GetArg[gc_f, Callable, Literal[1]])
496491
assert t is T
497492

@@ -644,7 +639,7 @@ class C:
644639

645640
f = eval_typing(GetMethodLike[IndirectProtocol[C], Literal["f"]])
646641
t = eval_typing(GetArg[f, Callable, Literal[0]])
647-
assert t == tuple[Param[Literal[None], int, Never],]
642+
assert t == tuple[Param[Literal[None], int],]
648643
t = eval_typing(GetArg[f, Callable, Literal[1]])
649644
assert t is int
650645

typemap/type_eval/_eval_operators.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ def _callable_type_to_method(name, typ):
489489
if has_pos_only:
490490
quals = typing.Literal[ParamKind.POSITIONAL_ONLY]
491491
else:
492-
quals = typing.Never
492+
quals = typing.Literal[ParamKind.POSITIONAL_OR_KEYWORD]
493493
# Override the receiver type with type[Self].
494494
# An annoying thing to know is that for a member classmethod of C,
495495
# cls *should* be type[C], but if it was not explicitly annotated, it
@@ -554,19 +554,21 @@ def _ann(x):
554554
quals = []
555555
if p.kind == inspect.Parameter.VAR_POSITIONAL:
556556
quals.append(ParamKind.VAR_POSITIONAL)
557-
if p.kind == inspect.Parameter.VAR_KEYWORD:
557+
elif p.kind == inspect.Parameter.VAR_KEYWORD:
558558
quals.append(ParamKind.VAR_KEYWORD)
559-
if p.kind == inspect.Parameter.KEYWORD_ONLY:
559+
elif p.kind == inspect.Parameter.KEYWORD_ONLY:
560560
quals.append(ParamKind.KEYWORD_ONLY)
561-
if p.kind == inspect.Parameter.POSITIONAL_ONLY:
561+
elif p.kind == inspect.Parameter.POSITIONAL_ONLY:
562562
quals.append(ParamKind.POSITIONAL_ONLY)
563+
else:
564+
quals.append(ParamKind.POSITIONAL_OR_KEYWORD)
563565
if p.default is not empty:
564566
quals.append(ParamKind.HAS_DEFAULT)
565567
params.append(
566568
Param[
567569
typing.Literal[p.name],
568570
_ann(ann),
569-
typing.Literal[*quals] if quals else typing.Never,
571+
typing.Literal[*quals],
570572
]
571573
)
572574

typemap/typing.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,11 @@ class ParamKind(enum.IntEnum):
152152
HAS_DEFAULT = 5
153153

154154

155-
class Param[N: str | None, T, Q: ParamKind = typing.Never]:
155+
class Param[
156+
N: str | None,
157+
T,
158+
Q: ParamKind = Literal[ParamKind.POSITIONAL_OR_KEYWORD],
159+
]:
156160
name: N
157161
typ: T
158162
quals: Q

0 commit comments

Comments
 (0)