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