gpt4 book ai didi

python - python 3(python 3.1,python 3k,python3000)中内置函数的两个相互矛盾的含义

转载 作者:行者123 更新时间:2023-11-28 18:55:45 26 4
gpt4 key购买 nike

我刚刚在下面发布了对 comp.lang.python 的查询,但我觉得这种问题在 Stack Overflow 上也有某种通行权,所以再重复一遍。本质:为什么“builtins”在 Python 3 中有两种不同的解释?

我很乐意接受任何关于这件事的评论句子,收集自 http://celabs.com/python-3.1/reference/executionmodel.html ,意思是,或者为什么众神决定这是要走的路。我预计这个名叫 Kay Schluehr 的人会对此有发言权,或者也许甚至 BDFL 也会关心将 __builtins__ 发音为对他的失败者、追随者和同伴的正确方式::

  The built-in namespace associated with the execution of  a code block is actually found by looking up the name  __builtins__ in its global namespace; this should be a  dictionary or a module (in the latter case the module’s  dictionary is used). By default, when in the __main__  module, __builtins__ is the built-in module builtins;  when in any other module, __builtins__ is an alias for  the dictionary of the builtins module itself.  __builtins__ can be set to a user-created dictionary to  create a weak form of restricted execution.

过去至少有两个不同的术语,“builtin”(单数形式)和“builtins”(复数形式),一些它以模块和字典形式存在(?只是猜测?)。现在只有 builtins,所以幸运的是两者之间的矛盾心理单数和复数都消失了——真好。

但是为什么 __builtins__ 会根据是否这是“脚本”的范围(即名称为在调用 python foobar.py 时出现,或者这是否是二级模块的范围(导入或执行,直接或间接地,通过 foobar.py)?我不明白其中的道理这背后并发现它非常困惑。

理由:我为什么要关心?——我希望能够“将名称导出到未标记为私有(private)的全局 namespace (通过下划线prefix) 在我通过 exec( compile( get
( locator ), locator, 'exec' ), R )
R 应该去哪里保存所述模块的私有(private)名称'。它有点神秘但是基本练习是绕过 python 的导入系统并获得 similr结果...这就是将名称注入(inject)全局和模块全局命名空间。

最佳答案

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

关于python - python 3(python 3.1,python 3k,python3000)中内置函数的两个相互矛盾的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2173425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com