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

如何让Transcrypt编译为JavaScript对象而非dict?

解决Transcrypt编译Python字典为原生JS对象的问题

嘿,这个问题我之前也踩过坑!Transcrypt默认把Python的dict编译成自己实现的包装类,而不是原生JavaScript对象,这就导致像fetch这种严格遵循JS规范的API不认它,抛出类型错误。下面给你几个实用的解决办法:

方法1:用__js__语法直接写原生JS对象

如果你想直接生成标准的JS对象字面量,可以用Transcrypt提供的__js__内置函数,它会把里面的字符串直接当作JS代码输出:

import json

def fetch_data(url, data):
    # 直接用__js__定义fetch的配置对象
    fetch_options = __js__('{method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify(data)}')
    fetch(url, fetch_options)

这样编译后的JS代码里就是纯原生对象,完全符合fetch的要求。

方法2:利用dict的__native__属性

Transcrypt的dict实例自带一个__native__属性,它指向对应的原生JS对象。你只需要把这个属性传给fetch就行:

import json

def fetch_data(url, data):
    # 先创建Python字典
    py_options = dict(
        method="POST",
        headers={"Content-Type": "application/json"},
        body=json.dumps(data)
    )
    # 取出原生JS对象传给fetch
    fetch(url, py_options.__native__)

这个方法既保留了Python字典的写法便利,又能转换成JS原生对象,很适合需要先在Python里处理配置的场景。

方法3:封装一个转换工具函数

如果你的代码里经常需要做这种转换,可以封装一个小函数,让代码更整洁:

def to_js_object(py_dict):
    """把Transcrypt的dict转换成原生JS对象"""
    return py_dict.__native__

# 使用示例
options = dict(method="GET", headers={"Accept": "application/json"})
fetch("/api/data", to_js_object(options))

为什么会出现这个错误?

简单来说,Transcrypt的dict不是原生JS对象——它是Transcrypt模拟Python字典特性实现的一个类,带有Python里的keys()、items()等方法,而fetch API要求传入的必须是原生JS对象(或者符合迭代器规范的对象),直接传Transcrypt的dict就会触发类型检查失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:58:49