You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用CustomConstruct时参数数量不符,第五个参数来自何处?

问题根源分析

你的问题出在TypeScript构造函数的第四个参数缺少参数名称,这违反了TypeScript语法规范,同时导致jsii转译工具无法正确解析参数列表,进而在Python端引发参数数量不匹配的错误。

具体原因:

  1. 错误的TS构造函数签名
    你原有的TypeScript构造函数写为:

    constructor(scope: Construct, id: string, keyProps: kms.KeyProps, sns.TopicProps)
    

    这里第四个参数只有类型sns.TopicProps,没有定义参数名(比如topicProps: sns.TopicProps)。TypeScript要求所有参数必须有标识符名称,这种写法本身就是不合法的。

  2. jsii转译的异常处理
    jsii在处理这种有语法问题的签名时,会错误地将无名称的第四个参数解析为Python中的可变关键字参数(**kwargs),而非显式的位置参数。生成的Python构造函数签名会变成类似:

    def __init__(self, scope, id, keyProps, **kwargs):
    
  3. Python调用时的参数不匹配
    当你在Python中调用CustomConstruct(self, "MyId", test, test1)时,实际传递给__init__方法的参数是:

    • self(新创建的CustomConstruct实例,Python自动传入)
    • scope=self(PythonCdkProjectStack的实例)
    • id="MyId"
    • keyProps=test
    • test1(第四个位置参数)
      这就导致总共传递了5个参数,而转译后的__init__只接受4个(self + 3个显式位置参数 + **kwargs),因此触发takes 4 positional arguments but 5 were given的错误。

验证:修改后的TS签名为何正常?

当你修改TS构造函数为:

constructor(scope: Construct, id: string, keyProps: kms.KeyProps, topicProps: sns.TopicProps, test: string)

此时所有参数都有明确的名称,jsii可以正确解析为5个位置参数,生成的Python构造函数签名为:

def __init__(self, scope, id, keyProps, topicProps, test):

你在Python中传递5个参数(self, "MyId", test, test1, "test"),对应__init__的scope, id, keyProps, topicProps, test,加上Python自动传入的self,参数数量完全匹配,因此可以正常运行。

解决方案:

修正TypeScript构造函数的参数签名,给第四个参数添加合法的参数名称:

constructor(scope: Construct, id: string, keyProps: kms.KeyProps, topicProps: sns.TopicProps)

重新用jsii-pacmak转译后,Python端调用CustomConstruct(self, "MyId", test, test1)即可正常运行。

内容的提问来源于stack exchange,提问作者SecretIndividual

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:45:35