我想要一些帮助来将一个相对简单的python包boolean.py
(这个包执行布尔代数操作)转换成javascript,使用transcrypt作为我选择的transpiler。
到目前为止我所做的事情:
使用似乎不受inspect
支持的transcrypt
模块放弃
在python代码中切换到显式的SuperClassName.__init__()
调用,而不是super(SuperClassName, self).__init__()
,因为transcrypt
只支持简单的单案例继承(和python 3语法)。
您可以在this github branch中找到名为transcrypt
的当前代码。
现在,好消息是boolean.py
实质上是.py
下的一个boolean/boolean.py
文件,其他一切都只是python项目结构。坏消息是boolean.py
同时在python2
和python3
上运行,我不知道这是不是导致我要描述的当前问题的原因:
在阅读了transcrypt docs的相关章节后,我对文件进行了传输:
cd boolean/ && transcrypt boolean.py
这给了我一个关于
basestring
的无害警告,并用__javascript__
和boolean.js
创建了boolean.min.js
文件夹。到目前为止,还不错。在我创建要测试的
__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
相反,我希望看到的是一个
boolean.html
对象,它有boolean
子对象。请参阅BooleanAlgebra
和hello
示例,以查看它相应地在pong
上创建transcrypt
和hello
对象。你能帮我解释一下我做错了什么吗?
最佳答案
我花了很多时间试图让你的lib与Transcrypt一起工作,遇到了几个问题:boolean.py
库使用CPython发行版中的一些模块,如__future__
和unittest
,这些模块还不可用于Transcrypt。这是一个很容易避免的问题。你可以背靠背地测试
Transcrypt和CPython版本boolean.py
使用Transcrypt的自动测试工具。写一个非常精简的版本。
@property decorator尚不可用。但是您可以使用非decorator语法中的属性,如http://www.transcrypt.org/docs/html/supported_constructs.html#properties
在您的改编代码中可能有一些错误,比如函数构造函数在无休止的递归中调用自己。
一些异常类型(如unittest
)尚未在Transcrypt中实现。
Transcrypt的TypeError
函数目前只定义了一个参数,像type
这样的函数暂时不起作用。
无法在Transcrypt中重载return type(base_class.__name__, (base_class,), {})
运算符函数。这是由于所需的与JavaScript的互操作性。类似{'bird':'egg','human':'baby'}这样的东西被编译成一个JavaScript对象文本,像在许多JavaScript库中一样,方便用对象文本初始化。
类的__hash__
方法被意外跳过。它将在Transcrypt的下一次提交中添加。
这些就是我能找到的问题。可能还有更多,但我对values ()
缺乏了解,无法在合理的时间内找到它们。
对我来说,最终的结果是我可以让它编译,但是在解析阶段开始之后,我无法让它正常运行。
我的期望是,对于熟悉您的库的人来说,这一切都可以通过可行的解决方案来解决,因为我在您的库中没有看到真正Transcrypt无法访问的代码。
Transcrypt永远不会100%兼容CPython,因为生成的代码必须与本机JavaScript一样快速和紧凑。但如果你遇到明显的遗漏,比如dict
,它们将被添加。也有像boolean.py
这样的边界情况。只要它们是小函数,我就没有理由不添加它们。只需向https://github.com/qquick/Transcrypt的问题添加一个功能请求。
像dict.values
这样的东西不太可能被添加到核心代码中,尽管在库中这样的数据结构的贡献当然是受欢迎的。
注意,如果需要,也可以在任何地方插入任意JavaScript代码片段。