我想要一些帮助来将一个相对简单的python包boolean.py(这个包执行布尔代数操作)转换成javascript,使用transcrypt作为我选择的transpiler。
到目前为止我所做的事情:
使用似乎不受inspect支持的transcrypt模块放弃
在python代码中切换到显式的SuperClassName.__init__()调用,而不是super(SuperClassName, self).__init__(),因为transcrypt只支持简单的单案例继承(和python 3语法)。
您可以在this github branch中找到名为transcrypt的当前代码。
现在,好消息是boolean.py实质上是.py下的一个boolean/boolean.py文件,其他一切都只是python项目结构。坏消息是boolean.py同时在python2python3上运行,我不知道这是不是导致我要描述的当前问题的原因:
在阅读了transcrypt docs的相关章节后,我对文件进行了传输:

cd boolean/ && transcrypt boolean.py

这给了我一个关于basestring的无害警告,并用__javascript__boolean.js创建了boolean.min.js文件夹。到目前为止,还不错。
在我创建要测试的__javascript__文件夹旁边:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">

        <title>transcrypt boolean.py</title>
    </head>
    <body>
        <script src="__javascript__/boolean.js"></script>
    </body>
</html>

但是,当我在firefox中加载boolean.html时,控制台会发出警告:
TypeError: can't assign to properties of (new String("all_feature_namesnested_scopes,generators,division,absolute_import,with_statement,print_function,unicode_literals,barry_as_FLUFL,generator_stop")): not an object

相反,我希望看到的是一个boolean.html对象,它有boolean子对象。请参阅BooleanAlgebrahello示例,以查看它相应地在pong上创建transcrypthello对象。
你能帮我解释一下我做错了什么吗?

最佳答案

我花了很多时间试图让你的lib与Transcrypt一起工作,遇到了几个问题:
boolean.py库使用CPython发行版中的一些模块,如__future__unittest,这些模块还不可用于Transcrypt。这是一个很容易避免的问题。你可以背靠背地测试
Transcrypt和CPython版本boolean.py使用Transcrypt的自动测试工具。写一个非常精简的版本。
@property decorator尚不可用。但是您可以使用非decorator语法中的属性,如http://www.transcrypt.org/docs/html/supported_constructs.html#properties
在您的改编代码中可能有一些错误,比如函数构造函数在无休止的递归中调用自己。
一些异常类型(如unittest)尚未在Transcrypt中实现。
Transcrypt的TypeError函数目前只定义了一个参数,像type这样的函数暂时不起作用。
无法在Transcrypt中重载return type(base_class.__name__, (base_class,), {})运算符函数。这是由于所需的与JavaScript的互操作性。类似{'bird':'egg','human':'baby'}这样的东西被编译成一个JavaScript对象文本,像在许多JavaScript库中一样,方便用对象文本初始化。
类的__hash__方法被意外跳过。它将在Transcrypt的下一次提交中添加。
这些就是我能找到的问题。可能还有更多,但我对values ()缺乏了解,无法在合理的时间内找到它们。
对我来说,最终的结果是我可以让它编译,但是在解析阶段开始之后,我无法让它正常运行。
我的期望是,对于熟悉您的库的人来说,这一切都可以通过可行的解决方案来解决,因为我在您的库中没有看到真正Transcrypt无法访问的代码。
Transcrypt永远不会100%兼容CPython,因为生成的代码必须与本机JavaScript一样快速和紧凑。但如果你遇到明显的遗漏,比如dict,它们将被添加。也有像boolean.py这样的边界情况。只要它们是小函数,我就没有理由不添加它们。只需向https://github.com/qquick/Transcrypt的问题添加一个功能请求。
dict.values这样的东西不太可能被添加到核心代码中,尽管在库中这样的数据结构的贡献当然是受欢迎的。
注意,如果需要,也可以在任何地方插入任意JavaScript代码片段。

08-16 13:53