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



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

到目前为止,我所做的事情:

  1. 使用inspect模块丢弃,该模块似乎不受transcrypt支持
  2. 切换到显式SuperClassName.__init__()调用,而不是在 python 代码中super(SuperClassName, self).__init__()transcrypt因为它只支持简单的单大小写继承(和 python 3 语法)。

您可以在名为transcrypt的 github 分支中找到当前代码。

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

在阅读了转录文档的相关部分后,我转译了文件:

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和CPython版本通过使用Transcrypt的自动测试工具boolean.py。写一个非常调低的版本unittest自己等。

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

  3. 改编的代码中可能存在一些错误,例如函数构造函数在无休止的递归中调用自己。

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

  5. Transcrypt的type函数目前只用一个参数定义,像return type(base_class.__name__, (base_class,), {})这样的东西目前不起作用。

  6. 无法重载 Transcrypt 中的__hash__运算符函数。这是由于与JavaScript所需的互操作性。像 {'bird': 'egg', 'human': 'baby'} 这样的东西被编译成 JavaScript 对象文字,便于使用对象文字进行初始化,就像许多 JavaScript 库中通常的那样。

  7. 不小心跳过了类dictvalues ()方法。它将被添加到Transcrypt的下一次提交中。

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

对我来说,最终结果是我可以编译它,但在解析阶段开始后我无法让它正常运行。

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

Transcrypt永远不会100%兼容CPython,因为要求生成的代码应该像原生JavaScript一样快速和紧凑。但是,如果您遇到像dict.values这样的明显遗漏,它们将被添加。也有像string.isalpha这样的边境案例.只要它们是小函数,我认为没有理由不添加它们。只需在 https://github.com/qquick/Transcrypt 的问题中添加功能请求即可。

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

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

相关内容

  • 没有找到相关文章

最新更新