diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index ac9023a0ad..40e411fa2b 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -467,9 +467,10 @@ abstract class BaseMethod implements PythonBase { jsiiMethodParams.push(`"${this.jsName}"`); } + // If the last arg is variadic, expand the tuple const paramNames: string[] = []; for (const param of this.parameters) { - paramNames.push(toPythonParameterName(param.name)); + paramNames.push((param.variadic ? '*' : '') + toPythonParameterName(param.name)); } code.line(`${methodPrefix}jsii.${this.jsiiMethod}(${jsiiMethodParams.join(", ")}, [${paramNames.join(", ")}])`); diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py index d2d53fec76..cc3a369245 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py +++ b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/__init__.py @@ -678,7 +678,7 @@ def optional_and_variadic(self, optional: typing.Optional[str]=None, *things: st optional: - things: - """ - return jsii.invoke(self, "optionalAndVariadic", [optional, things]) + return jsii.invoke(self, "optionalAndVariadic", [optional, *things]) class EraseUndefinedHashValues(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.EraseUndefinedHashValues"): @@ -2994,7 +2994,7 @@ def __init__(self, *prefix: jsii.Number) -> None: Arguments: prefix: a prefix that will be use for all values returned by ``#asArray``. """ - jsii.create(VariadicMethod, self, [prefix]) + jsii.create(VariadicMethod, self, [*prefix]) @jsii.member(jsii_name="asArray") def as_array(self, first: jsii.Number, *others: jsii.Number) -> typing.List[jsii.Number]: @@ -3003,7 +3003,7 @@ def as_array(self, first: jsii.Number, *others: jsii.Number) -> typing.List[jsii first: the first element of the array to be returned (after the ``prefix`` provided at construction time). others: other elements to be included in the array. """ - return jsii.invoke(self, "asArray", [first, others]) + return jsii.invoke(self, "asArray", [first, *others]) class VirtualMethodPlayground(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.VirtualMethodPlayground"): diff --git a/packages/jsii-python-runtime/tests/test_compliance.py b/packages/jsii-python-runtime/tests/test_compliance.py index c55291df0f..4ba2ffe6d5 100644 --- a/packages/jsii-python-runtime/tests/test_compliance.py +++ b/packages/jsii-python-runtime/tests/test_compliance.py @@ -42,6 +42,7 @@ UsesInterfaceWithProperties, composition, EraseUndefinedHashValues, + VariadicMethod, ) from scope.jsii_calc_lib import IFriendly, EnumFromScopedModule, Number @@ -895,3 +896,8 @@ def consume_partially_initialized_this(self, obj, dt, en): reflector = PartiallyInitializedThisConsumerImpl() obj = ConstructorPassesThisOut(reflector) assert obj is not None + + +def test_variadicMethodCanBeInvoked(): + variadic = VariadicMethod(1) + assert variadic.as_array(3, 4, 5, 6) == [1, 3, 4, 5, 6]