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

如何通过PythonKit(Swift)向Python函数传递关键字参数(kwargs)

如何通过PythonKit(Swift)向Python函数传递关键字参数(kwargs)

嗨,我来帮你搞定这个问题!你遇到的两个核心问题:一是误用了PythonKit的内部方法导致致命错误,二是没找对传递关键字参数(**kwargs)的正确姿势,咱们一步步来解决。

首先说你看到的那个致命错误:Could not access PythonObject member 'callas',这是因为你直接调用了.callas方法——这可是PythonKit内部用来实现函数调用的私有方法,咱们写代码的时候绝对不能直接碰它!正确的调用Python函数的方式,要么直接写函数名加参数,要么用PythonKit提供的call(with:keywords:)方法,后者刚好适合咱们传递关键字参数的场景。

再看你的Python函数sqlCreateTable,它前两个是位置参数,最后是**columns用来接收任意关键字参数。在Swift的PythonKit里,要把Swift字典转成Python能识别的**kwargs,最稳妥的方式就是用call(with:keywords:)方法:把前两个位置参数塞进数组里,把你的列名字典传给keywords参数就行。

给你修改好的完整代码:

private func createDBDirectory() {
    let DBDirectoryPath = createDirectory(folderName: "databases")!.path
    userConfig.DBPath = DBDirectoryPath + "/fileORGS.db"
    let sqlInteract = Python.import("sqlFunctions")
    // 这里如果要传Python的None而不是字符串"NULL",记得用PythonObject.none
    let tagInfoCols: [String: PythonObject] = [
        "tag": "NULL", 
        "tagHashID": "NULL", 
        "tagCreationTime": "NULL", 
        "tagColor": "NULL"
    ]
    // 用call(with:keywords:)明确区分位置参数和关键字参数
    sqlInteract.sqlCreateTable.call(with: [userConfig.DBPath, "tagINFO"], keywords: tagInfoCols)
}

另外给你提个小建议:你现在字典里的值是Swift字符串"NULL",但Python里对应的空值是None,如果你的SQL函数期望的是SQL的NULL,其实传递Python的None会更准确(因为很多Python SQL库会自动把None转成SQL的NULL)。如果要改的话,把"NULL"换成PythonObject.none就行,比如:

let tagInfoCols: [String: PythonObject] = [
    "tag": PythonObject.none,
    "tagHashID": PythonObject.none,
    "tagCreationTime": PythonObject.none,
    "tagColor": PythonObject.none
]

最后再复盘下关键点:

  • 绝对不要直接调用.callas,这是PythonKit内部用的,碰了就会报错
  • 传递**kwargs用call(with:keywords:),位置参数放数组,关键字参数放字典
  • 注意Swift字符串和Python空值的区别,别把"NULL"和None搞混

备注:内容来源于stack exchange,提问作者Aqawma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:42:56