怎么能让Transcrypt编译成对象而不是dict?

时间:2018-05-19 15:52:17

标签: javascript python dictionary object transcrypt

我正在尝试使用Transcrypt的fetch API。

来源:

headers = {
    "Access-Control-Request-Method": "GET",
    "Access-Control-Request-Headers": "origin, x-requested-with",
    "Origin": "https://bar.com/"
}

args = {
    "method":"OPTIONS",
    "headers":headers
}

fetch("https://foo.com/",args).then(
    lambda response: print(response),
    lambda err: print(err)
)

编译为:

var headers = dict ({'Access-Control-Request-Method': 'GET', 'Access-Control-Request-Headers': 'origin, x-requested-with', 'Origin': 'https://bar.com/'});
        var args = dict ({'method': 'OPTIONS', 'headers': headers});
        fetch ('https://foo.com/', args).then ((function __lambda__ (response) {
            return print (response);
        }), (function __lambda__ (err) {
            return print (err);
        }));

打印:

TypeError: Failed to execute 'fetch' on 'Window': Iterator is not an object.

如果我从已编译的代码中删除dict,它就会运行。

如何编译到正确的Javascript对象而不是dict?

1 个答案:

答案 0 :(得分:2)

现在知道了。

事实证明:

https://www.transcrypt.org/docs/html/special_facilities.html#create-bare-javascript-objects-and-iterate-over-their-attributes-from-python-pragma-jsiter-and-pragma-nojsiter

  

通常,Python {...}文字被编译为dict({...})以包含   Python字典的特殊属性和方法,包括例如一个   迭代器。当 pragma (' jsiter')处于活动状态时,Python {...}字面值   被编译为裸{...},没有特殊的属性或方法。至   仍然可以迭代这样一个简单的JavaScript的属性   来自Python的对象,当 pragma (' jsiter')处于活动状态时,Python为   ... in ...字面翻译为JavaScript(var ... in   ...)。这个pragma的主要用例是方便循环   通过元类的 new 方法中的类属性。作为一个   更灵活,但不太方便的选择, pragma (' js',   可以使用' {}',''' ...''')。

所以代码应该是:

__pragma__('jsiter')

headers = {
    "Access-Control-Request-Method": "GET",
    "Access-Control-Request-Headers": "origin, x-requested-with",
    "Origin": "https://bar.com/"
}

args = {
    "method":"OPTIONS",
    "headers":headers
}

__pragma__('nojsiter')