使用 Transcrypt 将 boolean.py 包转译为 javascript

Transpiling boolean.py package to javascript with Transcrypt

我需要一些帮助,将名为 boolean.py 的相对简单的 python 包(该包执行布尔代数运算)转换为 javascript,使用 transcrypt 作为我选择的转译器。

到目前为止我完成的事情:

  1. 放弃使用 inspect 模块,transcrypt
  2. 似乎不支持该模块
  3. 切换到显式 SuperClassName.__init__() 调用而不是 python 代码中的 super(SuperClassName, self).__init__() 因为 transcrypt 仅支持简单的单例继承(和 python 3 语法).

您可以在 this github branch 中找到当前代码 transcrypt

现在,好消息是 boolean.py 本质上是 boolean/boolean.py 下的单个 .py 文件,其他一切都只是 python 项目结构。坏消息是 boolean.pypython2python3 上运行,我不知道这是否是导致我将要描述的当前问题的原因:

阅读了 transcrypt docs 的相关部分后,我转译文件:

cd boolean/ && transcrypt boolean.py

这给了我一个关于 basestring 的无害警告,并创建了包含 boolean.jsboolean.min.js__javascript__ 文件夹。到目前为止,还不错。

在我创建 boolean.html__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

相反,我期望看到的是一个具有 BooleanAlgebra 子对象的 boolean 对象。参考 transcrypthellopong 示例,可以看到它相应地在 window 上创建了 hellopong 对象。

你能帮我解释一下我做错了什么吗?

我花了很多时间试图让你的库与 Transcrypt 一起工作,遇到了几个问题:

  1. boolean.py 库使用 CPython 发行版中的一些模块,例如 __future__unittest,它们尚不可用于 Transcrypt。这是一个很容易规避的问题。你可以例如背靠背测试 使用 Transcrypt 的自动测试工具进行 Transcrypt 和 CPython 版本 boolean.py。自己写一个非常精简的 unittest 版本等等

  2. @属性 装饰器尚不可用。但是您可以在非装饰器语法中使用属性,如 http://www.transcrypt.org/docs/html/supported_constructs.html#properties

  3. 中的文档所示
  4. 您改编的代码中可能存在一些错误,例如 Function 构造函数在无限递归中调用自身。

  5. 某些异常类型(如 TypeError)尚未在 Transcrypt 中实现。

  6. Transcrypt 的type 函数目前只定义了一个参数,像return type(base_class.__name__, (base_class,), {}) 之类的目前无法使用。

  7. 无法在 Transcrypt 中重载 __hash__ 运算符函数。这是由于需要与 JavaScript 的互操作性。像 {'bird': 'egg', 'human': 'baby'} 之类的东西被编译成一个 JavaScript 对象字面量,这在许多情况下都有助于使用对象字面量进行初始化JavaScript 个库。

  8. 不小心跳过了classdictvalues ()方法。它将在 Transcrypt 的下一次提交中添加。

这些是我能找到的问题。可能还有更多,但我缺乏boolean.py的理解,无法在合理的时间内找到它们。

我的最终结果是我可以编译它,但是在解析阶段开始后我无法将它正确地编译到 运行。

我的期望是,对于非常了解您的库的人来说,这一切都可以通过可行的解决方法来解决,因为我在您的库中没有看到真正超出 Transcrypt 范围的代码。

Transcrypt 永远不会 100% CPython 兼容,因为要求生成的代码应该像原生代码一样快速和紧凑 JavaScript。但是如果遇到明显的遗漏,比如dict.values,会补上的。还有像 string.isalpha 这样的边界情况。只要它们是小函数,我认为没有理由不添加它们。只需向 https://github.com/qquick/Transcrypt.

的问题添加功能请求

frozenset 这样的东西不太可能被添加到核心代码中,尽管在库中贡献这样的数据结构当然是受欢迎的。

请注意,如果需要,您还可以在任何地方插入任意 JavaScript 代码片段。