我想帮助将一个名为boolean.py
的相对简单的python包(该包执行布尔代数操作)转换为javascript,使用transcrypt作为我的首选转换器。
到目前为止我所做的事情:
inspect
transcrypt
模块删除
SuperClassName.__init__()
调用而不是super(SuperClassName, self).__init__()
,因为transcrypt
仅支持简单的单例继承(和python 3语法)。您可以在名为transcrypt
的{{3}}中找到当前代码。
现在,好消息是boolean.py
本质上是.py
下的单个boolean/boolean.py
文件,其他一切都只是python项目结构。坏消息是boolean.py
python2
和python3
同时运行,我不知道这是否是导致我将要描述的当前问题的原因:
阅读了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
上的pong
和window
对象。
你能帮我解释一下我在做错了吗?
答案 0 :(得分:4)
我花了很长时间试图让你的lib与Transcrypt一起工作,遇到了几个问题:
boolean.py
库使用CPython发行版中的一些模块,如__future__
和unittest
,这些模块尚不可用于Transcrypt。这是一个容易规避的问题。你可以,例如背靠背测试
Transcrypt和CPython版本boolean.py
使用Transcrypt的自动测试工具。编写一个非常精简的版本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的所需互操作性。像{&#39; bird&#39 ;:&#39; egg&#39;,&#39; human&#39;:&#39; baby&#39;}之类的东西被编译成JavaScript对象文字,便于初始化与许多JavaScript库中常见的对象文字一样。
类values ()
的{{1}}方法被意外跳过。它将在Transcrypt的下次提交中添加。
这些是我能找到的问题。可能会有更多,但我缺乏对dict
的理解,无法在合理的时间内找到它们。
对我来说,最终的结果是我可以让它进行编译,但是在解析阶段开始后我无法正常运行。
我的期望是,对于那些了解你的图书馆的人来说,这一切都可以通过可行的解决方法来解决,因为我发现你的lib中没有任何代码真的超出了Transcrypt。
Transcrypt永远不会100%与CPython兼容,因为要求生成的代码应该像本机JavaScript一样快速和紧凑。但如果您遇到明确的遗漏,例如boolean.py
,则会添加它们。还有像dict.values
这样的边界案例。只要它们具有小功能,我认为没有理由不添加它们。只需在https://github.com/qquick/Transcrypt处为问题添加功能请求。
像string.isalpha
这样的东西不太可能被添加到核心代码中,尽管这样的数据结构在库中的贡献当然是受欢迎的。
请注意,如果需要,您还可以在任何地方插入任意JavaScript代码片段。