2

I would like some help transpiling a relatively simple python package called boolean.py (the package does boolean algebra operations) into javascript using transcrypt as my transpiler of choice.

Things I have done so far:

  1. Dropped using inspect module which seems to not be supported by transcrypt
  2. Switched to explicit SuperClassName.__init__() calls instead of super(SuperClassName, self).__init__() in python code because transcrypt only supports simple single-case inheritance (and python 3 syntax).

You can find the current code here in this github branch called transcrypt.

Now, the good news is that boolean.py is essentially a single .py file under boolean/boolean.py, everything else is just python project structure. The bad news is that boolean.py runs on both python2 and python3 and I don't know if that is what causes the current issue that I am about to describe:

Having read the relevant sections of transcrypt docs, I transpile the file:

cd boolean/ && transcrypt boolean.py

This gives me a single harmless warning about basestring and creates the __javascript__ folder with boolean.js and boolean.min.js. So far, so good.

Next to the __javascript__ folder I create boolean.html to test:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">

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

However, when I load boolean.html in firefox, the console gives a warning:

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

Instead, what I am expecting to see is a boolean object that has BooleanAlgebra subobject. Refer to hello and pong examples of transcrypt to see that it creates hello and pong objects on window accordingly.

Could you help explain what I am doing wrong here?

4

1 回答 1

4

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

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

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

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

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

  5. Transcrypt 的type功能目前只定义了一个参数,类似的东西目前return type(base_class.__name__, (base_class,), {})不起作用。

  6. 在 Transcrypt中不能重载__hash__操作符函数。这是由于所需的与 JavaScript 的互操作性。像 {'bird': 'egg', 'human': 'baby'} 之类的东西被编译成 JavaScript 对象字面量,这有助于像许多 JavaScript 库中常见的那样使用对象字面量进行初始化。

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

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

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

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

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

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

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

于 2017-06-10T11:20:14.860 回答