python中import和from...import...有关头文件的使用方法及工作原理

一、前言

今天在看复刻transformer代码时突然对import头文件有了想法。

于是就查找官方手册学习并记录下来。

二、import 工作原理

1、import 执行过程

基本的 import 语句(不带 from 子句)会分两步执行:

  1. 查找一个模块,如果有必要还会加载并初始化模块。
  2. 在局部命名空间中为 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 使用的过程繁复些:

  1. 查找 from 子句中指定的模块,如有必要还会加载并初始化模块;

  2. 对于 import 子句中指定的每个标识符:

    • 检查被导入模块是否有该名称的属性

    • 如果没有,尝试导入具有该名称的子模块,然后再次检查被导入模块是否有该属性

    • 如果未找到该属性,则引发 ImportError。

    • 否则的话,将对该值的引用存入局部命名空间,如果有 as 子句则使用其指定的名称,否则使用该属性的名称

2、from…import * 补充说明

如果标识符列表改为一个星号 (’*’),则在模块中定义的全部公有名称都将按 import 语句所在的作用域被绑定到局部命名空间。

当指定要导入哪个模块时,你不必指定模块的绝对名称。 当一个模块或包被包含在另一个包之中时,可以在同一个最高层级包中进行相对导入,而不必提及包名称。

from nltk import download_shell

from nltk import *

3、from . import mod 补充说明

通过在 from 之后指定的模块或包中使用(’.’),可以在不指定确切名称的情况下指明在当前包层级结构中要上溯多少级。

一个(’.’) 表示是执行导入的模块所在的当前包。

from . import mod 
# 则导入pkg.mod

两个(’. .’)表示上溯一个包层级。

from ..subpkg1 import mod 
# 则导入pkg.subpkg1.mod

三个(’…’)表示上溯两级,依此类推。

 from ...subpkg2 import mod 
 # 则导入pkg.subpkg1.subpkg2.mod
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值