Skip to content

Commit 69a48e4

Browse files
committed
Don't raise MissingParameter on keyword-only params when **kwargs is present.
PiperOrigin-RevId: 600902503
1 parent d18fe8c commit 69a48e4

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

pytype/abstract/_function_base.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -525,17 +525,16 @@ def _map_args(self, node, args):
525525
raise function.WrongKeywordArgs(sig, args, self.ctx, posonly_kws)
526526
callargs.update(positional)
527527
callargs.update(kws)
528-
for key, kwonly in self.get_nondefault_params():
528+
for key, kwonly in itertools.chain(
529+
self.get_nondefault_params(),
530+
((key, True) for key in sig.kwonly_params)):
529531
if key not in callargs:
530532
if args.starstarargs or (args.starargs and not kwonly):
531533
# We assume that because we have *args or **kwargs, we can use these
532534
# to fill in any parameters we might be missing.
533535
callargs[key] = self.ctx.new_unsolvable(node)
534536
else:
535537
raise function.MissingParameter(sig, args, self.ctx, key)
536-
for key in sig.kwonly_params:
537-
if key not in callargs:
538-
raise function.MissingParameter(sig, args, self.ctx, key)
539538
if sig.varargs_name:
540539
varargs_name = sig.varargs_name
541540
extraneous = posargs[self.argcount(node):]

pytype/tests/test_dataclasses.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,18 @@ class C:
781781
def __init__(self, *, x: int = ..., y: str) -> None: ...
782782
""")
783783

784+
@test_utils.skipBeforePy((3, 10), "KW_ONLY is new in 3.10")
785+
def test_kwonly_and_kwargs(self):
786+
self.Check("""
787+
import dataclasses
788+
@dataclasses.dataclass
789+
class C:
790+
_: dataclasses.KW_ONLY
791+
x: int
792+
def f(**kwargs):
793+
return C(**kwargs)
794+
""")
795+
784796
def test_star_import(self):
785797
with self.DepTree([("foo.pyi", """
786798
import dataclasses

0 commit comments

Comments
 (0)