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