Files
micropython/tests/basics/fun_callstardblstar.py
David Lechner 783b1a868f py/runtime: Allow multiple *args in a function call.
This is a partial implementation of PEP 448 to allow unpacking multiple
star args in a function or method call.

This is implemented by changing the emitted bytecodes so that both
positional args and star args are stored as positional args.  A bitmap is
added to indicate if an argument at a given position is a positional
argument or a star arg.

In the generated code, this new bitmap takes the place of the old star arg.
It is stored as a small int, so this means only the first N arguments can
be star args where N is the number of bits in a small int.

The runtime is modified to interpret this new bytecode format while still
trying to perform as few memory reallocations as possible.

Signed-off-by: David Lechner <david@pybricks.com>
2022-03-31 16:59:30 +11:00

28 lines
568 B
Python

# test calling a function with *tuple and **dict
def f(a, b, c, d):
print(a, b, c, d)
f(*(1, 2), **{'c':3, 'd':4})
f(*(1, 2), **{['c', 'd'][i]:(3 + i) for i in range(2)})
try:
eval("f(**{'a': 1}, *(2, 3, 4))")
except SyntaxError:
print("SyntaxError")
# test calling a method with *tuple and **dict
class A:
def f(self, a, b, c, d):
print(a, b, c, d)
a = A()
a.f(*(1, 2), **{'c':3, 'd':4})
a.f(*(1, 2), **{['c', 'd'][i]:(3 + i) for i in range(2)})
try:
eval("a.f(**{'a': 1}, *(2, 3, 4))")
except SyntaxError:
print("SyntaxError")