首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Transcrypt将boolean.py包转换为javascript

用Transcrypt将boolean.py包转换为javascript
EN

Stack Overflow用户
提问于 2017-06-09 17:41:52
回答 1查看 196关注 0票数 2

我希望得到一些帮助,将一个相对简单的称为boolean.py (包执行布尔代数操作)的python包转到javascript中,使用transcrypt作为我的选择。

我迄今所做的事情:

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

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

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

在阅读了跨隐窝文档的相关部分之后,我传输了该文件:

代码语言:javascript
复制
cd boolean/ && transcrypt boolean.py

这给了我一个关于basestring的无害警告,并使用boolean.jsboolean.min.js创建了__javascript__文件夹。到现在为止还好。

__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>

但是,当我在火狐中加载boolean.html时,控制台会发出警告:

代码语言:javascript
复制
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对象。参考hellopongtranscrypt示例,可以看到它相应地在window上创建了hellopong对象。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-10 11:20:14

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

  1. boolean.py库使用来自CPython发行版的一些模块,如__future__unittest,这些模块还不能用于Transcrypt。这是一个很容易解决的问题。您可以使用Transcrypt的自动测试工具对Transcrypt和CPython版本的boolean.py进行背靠背测试。编写一个非常调优的unittest版本,等等。
  2. @property装饰器尚未可用。但是,您可以使用非修饰器语法中的属性,如constructs.html#properties上的docs所示。
  3. 在您的代码中可能会出现一些错误,比如函数构造函数在没完没了的递归中调用自己。
  4. 有些异常类型(如TypeError)尚未在Transcrypt中实现。
  5. Transcrypt的type函数目前只定义了一个参数,类似于return type(base_class.__name__, (base_class,), {})这样的函数现在无法工作。
  6. 在Transcrypt中不可能重载__hash__算子函数。这是由于需要与JavaScript的互操作性。类似于{‘鸟’:‘蛋’,‘人’:‘婴儿’}被编译成一个JavaScript对象文本,这有助于像许多JavaScript库中一样使用对象文字进行初始化。
  7. 不小心跳过了类values ()方法dict。它将在下一次提交Transcrypt时添加。

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

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

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

Transcrypt永远不会是100% CPython兼容的,因为生成的代码应该与本地JavaScript一样快速和紧凑。但如果你遇到明显的遗漏,如dict.values,他们将被添加。也有像string.isalpha这样的边境病例。只要它们是小函数,我就没有理由不添加它们。只需向https://github.com/qquick/Transcrypt上的问题添加一个特性请求即可。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44463861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档