3

我刚刚在 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 的导入系统并获得类似的结果......这都是关于将名称注入到全局和模块全局命名空间中。

4

1 回答 1

1

getattr(__builtins__, '__dict__', __builtins__)应该为您提供要更新为“将名称导出到全局名称空间”的字典,无论__builtins__是字典(然后它没有__dict__属性因此getattr返回第三个参数,即字典__builtins__本身)还是模块(然后它确实具有该属性并getattr返回它)。这是解决方法。至于为什么 Python 被记录以需要如此复杂的解决方法的方式工作,我将其归类为一个不幸的案例,即实现问题浮出到用户可见(并且确实记录)级别(叹气)。可惜我们没有考虑在迁移到 Python 3 时修复它,但现在进行向后不兼容的更改为时已晚:-(。

于 2010-01-31T21:38:38.847 回答