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 的类型是字典。