我刚刚在 comp.lang.python 的查询下面发布了,但我觉得这种问题在 Stack Overflow 上也有某种优先权,所以重复一遍。本质:为什么'builtins'在Python 3中有两种不同的解释?
我很乐意接受关于从http://celabs.com/python-3.1/reference/executionmodel.html收集到的这句话的任何评论,或者为什么神决定这是要走的路。我预计这个名叫 Kay Schluehr 的人会对此有发言权,或者甚至 BDFL 也会关心__builtins__
向他的失败者、追随者和伙伴们发出正确的方式::
与执行相关的内置命名空间 通过查找名称实际上找到了一个代码块 __builtins__ 在其全局命名空间中;这应该是一个 字典或模块(在后一种情况下模块的 使用字典)。默认情况下,当在 __main__ module, __builtins__ 是内置模块builtins; 当在任何其他模块中时, __builtins__ 是 内置模块本身的字典。 __builtins__ 可以设置为用户创建的字典 创建受限执行的弱形式。
过去至少有两个不同的术语,'builtin'(单数)和'builtins'(复数),其中一些以模块和字典形式存在(?只是猜测?) . 现在只有builtins
,所以幸运的是,单数和复数之间的矛盾已经消失了——很好摆脱。
但是为什么会__builtins__
根据这是否是“脚本”的范围(即,在调用时存在名称的模块python foobar.py
)或这是否是辅助模块的范围(直接或间接导入或执行,由foobar.py
)? 我无法理解这背后的原因,并且发现它非常混乱。
基本原理:我为什么要关心?—我希望能够将名称导出到在我执行的 python 模块中未标记为私有(通过下划线前缀)的全局名称空间,该模块exec( compile( get
( locator ), locator, 'exec' ), R )
应该R
保存私有名称所述模块'。这有点神秘,但基本练习是绕过 python 的导入系统并获得类似的结果......这都是关于将名称注入到全局和模块全局命名空间中。