diff options
author | Mark Shannon <mark@hotpy.org> | 2020-06-01 09:42:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-01 09:42:42 (GMT) |
commit | db64f12e4deda2abbafb6d2bd5c06762fca991ff (patch) | |
tree | cbaf24cd7eea578450bd3ea6396cf1cd4bbddf4a | |
parent | a871f692b4a2e6c7d45579693e787edc0af1a02c (diff) | |
download | cpython-db64f12e4deda2abbafb6d2bd5c06762fca991ff.zip cpython-db64f12e4deda2abbafb6d2bd5c06762fca991ff.tar.gz cpython-db64f12e4deda2abbafb6d2bd5c06762fca991ff.tar.bz2 |
Make sure that keyword arguments are merged into the arguments dictionary when dict unpacking and keyword arguments are interleaved. (GH-20553)
-rw-r--r-- | Lib/test/test_extcall.py | 18 | ||||
-rw-r--r-- | Python/compile.c | 3 |
2 files changed, 21 insertions, 0 deletions
diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index 1faf29e..4205ca8 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -79,6 +79,24 @@ Here we add keyword arguments >>> f(1, 2, 3, *(4, 5), x=6, y=7, **UserDict(a=8, b=9)) (1, 2, 3, 4, 5) {'a': 8, 'b': 9, 'x': 6, 'y': 7} +Mix keyword arguments and dict unpacking + + >>> d1 = {'a':1} + + >>> d2 = {'c':3} + + >>> f(b=2, **d1, **d2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, b=2, **d2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, **d2, b=2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, b=2, **d2, d=4) + () {'a': 1, 'b': 2, 'c': 3, 'd': 4} + Examples with invalid arguments (TypeErrors). We're also testing the function names in the exception messages. diff --git a/Python/compile.c b/Python/compile.c index 4a587c0..fccc688 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -4321,6 +4321,9 @@ ex_call: if (!compiler_subkwargs(c, keywords, i - nseen, i)) { return 0; } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } have_dict = 1; nseen = 0; } |