如何让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
相关产品推荐
相关产品推荐

