在为TranscryptPython to JavaScript编译器在ES6模块之上实现Python模块机制时,我面临以下问题:
有大量从Python运行时模块导入的标准函数,例如Python input
函数(在JS中实现),可以使用命名导入(因为它们不必在用户代码中加任何前缀,所以input
而不是{
在Python中,允许重新绑定命名的导入。所以我定义了另一个函数input
,它将覆盖运行时的函数。但是如果我在JS中这样做,我会得到一个错误:
Identifier 'input' has already been declared
似乎所有导入的名称都被视为JS const,因此根据this article不可重新绑定。我可以想出几个聪明的解决方法,比如在别名下导入,然后将其分配给模块global var而不是const,但是我喜欢保持简单,所以我的问题是:
与per the language specification一样,导入的绑定是不可变的绑定,因此无法更改。由于ES6模块的工作方式,在解析模块时标识符是保留的:与Python不同,导入不是在执行时包含的语句;相反,模块的所有导入基本上都是在早期编译期间收集的,然后在模块开始执行之前解析。在
这使得ES6模块不适合作为Python导入系统的实现。在
一般来说,为了避免丢失这些名称,只需为导入的绑定指定不同的名称。例如,
from foo import bar, baz
可以编译为以下内容:这将只保留一些特殊名称,同时保持
bar
和baz
标识符可变。在另一种可能也有助于解决可能的导入语义差异的方法是创建一个闭包:
^{pr2}$或者在两者之间添加其他查找机制。在
顺便说一句,Python的
import
与Node的require
非常相似,因此,有必要研究一下使Node的模块系统在浏览器中工作的所有解决方案。在相关问题 更多 >
编程相关推荐