使用Transcrypt将boolean.py包传递给javascript

时间:2017-06-09 17:41:52

标签: javascript python transcrypt

我想帮助将一个名为boolean.py的相对简单的python包(该包执行布尔代数操作)转换为javascript,使用transcrypt作为我的首选转换器。

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

  1. 使用似乎inspect
  2. 不支持的transcrypt模块删除
  3. 在python代码中切换到显式SuperClassName.__init__()调用而不是super(SuperClassName, self).__init__(),因为transcrypt仅支持简单的单例继承(和python 3语法)。
  4. 您可以在名为transcrypt的{​​{3}}中找到当前代码。

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

    阅读了this github branch的相关章节后,我将文件转换为:

    cd boolean/ && transcrypt boolean.py
    

    这为我提供了关于basestring的单一无害警告,并使用__javascript__boolean.js创建了boolean.min.js文件夹。到目前为止,非常好。

    __javascript__文件夹旁边,我创建了boolean.html来测试:

    <!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子对象的BooleanAlgebra对象。请参阅hello的{​​{1}}和pong示例,了解transcrypt hello上的pongwindow对象。

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

  5. 某些例外类型(例如TypeError)尚未在Transcrypt中实施。

  6. Transcrypt的type函数目前只使用一个参数定义,类似return type(base_class.__name__, (base_class,), {})的内容将无效。

  7. 无法在Transcrypt中重载__hash__运算符函数。这是由于与JavaScript的所需互操作性。像{&#39; bird&#39 ;:&#39; egg&#39;,&#39; human&#39;:&#39; baby&#39;}之类的东西被编译成JavaScript对象文字,便于初始化与许多JavaScript库中常见的对象文字一样。

  8. values ()的{​​{1}}方法被意外跳过。它将在Transcrypt的下次提交中添加。

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

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

    我的期望是,对于那些了解你的图书馆的人来说,这一切都可以通过可行的解决方法来解决,因为我发现你的lib中没有任何代码真的超出了Transcrypt。

    Transcrypt永远不会100%与CPython兼容,因为要求生成的代码应该像本机JavaScript一样快速和紧凑。但如果您遇到明确的遗漏,例如boolean.py,则会添加它们。还有像dict.values这样的边界案例。只要它们具有小功能,我认为没有理由不添加它们。只需在https://github.com/qquick/Transcrypt处为问题添加功能请求。

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

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