python3 中的 builtins 和 __builtin__

1 内建模块

在 Python 中,有一个内建模块,该模块中有一些常用函数;而该模块在 Python 启动后、且没有执行程序员所写的任何代码前,Python会 首先加载该内建函数到内存。另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,其原因是对函数、变量、类等标识符的查找是按LE(N)GB法 则,其中B即代表内建模块。

2 python2 中的 __builtin__ 和 __builtins__

python2 中有 __builtin__ 和 __builtins__,二者的区别详见深入理解 Python2 中的 __builtin__ 和 __builtins__,总结概括如下:

  • 在 Python 中并没有 __builtins__ 这个模块,只有 __builtin__ 模块,__builtins__ 模块只是在启动 Python 解释器时,解释器为我们自动创建的一个到 __builtin__ 模块的引用
  • 如果是在主模块 __main__ 中,__builtins__ 直接引用 __builtin__ 模块,此时模块名 __builtins__ 与模块名 __builtin__ 指向的都是同一个模块
  • 如果不是在主模块中,那么 __builtins__ 只是引用了__builtin__.__dict__

Python3 中,__builtin__ 模块被命名为builtins

3 python3 中的 builtins 和 __builtins__

3.1 添加内建函数

当使用内建模块中函数或其它功能时,可以直接使用,不用添加内建模块的名字;但是,如果想要向内建模块中添加一些功能,以便在任何函数中都能直接使用而不用再进行 import,这时,就要导入内建模块 builtins( python2 导入 __builtin__),在内建模块的命名空间(即 __dict__ 字典属性)中添加该功能。就要导入 模块。

import builtins


def print_hello():
    print("hello, world")


builtins.__dict__['hello'] = print_hello
print_hello()		# 将打印"hello, world"
hello()				# 将打印"hello, world"

此时,print_hello 和 hello 两个函数名几乎是一样,但是有一点区别,print_hello 只能在该模块中使用,而 hello 可以在本程序中的其它任何一个模块中使用,因为 hello 已经放到内建模块中了。

3.2 builtins 和 __builtin__ 的区别与联系

  • 在 Python 中没有 builtins 模块,只有 __builtin__ 模块,builtins 模块只是 __builtin__ 模块的引用

区别:

  • 主模块 main 中:builtins 是对内建模块 __builtin__ 本身的引用,即 builtins 完全等价于 __builtin__,二者完全是一个东西
  • 非 main 模块中:builtins 仅是对 __builtin__.dict 的引用,而非 __builtin__ 本身。它在任何地方都可见。此时 builtins 的类型是字典

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/109482015