一、前言
今天在看复刻transformer代码时突然对import头文件有了想法。
于是就查找官方手册学习并记录下来。
二、import 工作原理
1、import 执行过程
基本的 import 语句(不带 from 子句)会分两步执行:
- 查找一个模块,如果有必要还会加载并初始化模块。
- 在局部命名空间中为 import 语句发生位置所处的作用域定义一个或多个名称。
当语句包含多个子句(由逗号分隔)时这两个步骤将对每个子句分别执行,如同这些子句被分成独立的 import 语句一样。
import jieba,math
import jieba
import math
2、import 执行失败
如果这一步失败,则可能说明模块无法找到(没有安装三方库),或者是在初始化模块,包括执行模块代码期间发生了错误。
3、import 执行成功
如果成功获取到请求的模块,则可以通过以下三种方式一之在局部命名空间中使用:
-
如果模块名称之后带有 as,则跟在 as 之后的名称将直接绑定到所导入的模块。import numpy as np -
如果没有指定其他名称,且被导入的模块为最高层级模块,则模块的名称将被绑定到局部命名空间作为对所导入模块的引用。import jieba -
如果被导入的模块 不是最高层级模块,则包含该模块的最高层级包的名称将被绑定到局部命名空间作为对该最高层级包的引用。所导入的模块必须使用其完整限定名称来访问而不能直接访问。import matplotlib.pyplot as plt
三、from…import… 工作原理
1、from…import… 执行流程
from 使用的过程繁复些:
-
查找 from 子句中指定的模块,如有必要还会加载并初始化模块; -
对于 import 子句中指定的每个标识符:
-
检查被导入模块是否有该名称的属性 -
如果没有,尝试导入具有该名称的子模块,然后再次检查被导入模块是否有该属性 -
如果未找到该属性,则引发 ImportError。 -
否则的话,将对该值的引用存入局部命名空间,如果有 as 子句则使用其指定的名称,否则使用该属性的名称
2、from…import * 补充说明
如果标识符列表改为一个星号 (’*’),则在模块中定义的全部公有名称都将按 import 语句所在的作用域被绑定到局部命名空间。
当指定要导入哪个模块时,你不必指定模块的绝对名称。 当一个模块或包被包含在另一个包之中时,可以在同一个最高层级包中进行相对导入,而不必提及包名称。
from nltk import download_shell
from nltk import *
3、from . import mod 补充说明
通过在 from 之后指定的模块或包中使用(’.’),可以在不指定确切名称的情况下指明在当前包层级结构中要上溯多少级。
一个(’.’) 表示是执行导入的模块所在的当前包。
from . import mod
两个(’. .’)表示上溯一个包层级。
from ..subpkg1 import mod
三个(’…’)表示上溯两级,依此类推。
from ...subpkg2 import mod
|