详解Python中的from..import绝对导入语句


Posted in Python onJune 21, 2016

相对或者绝对import
更多的复杂部分已经从python2.5以来实现:导入一个模块可以指定使用绝对或者包相对的导入。这个计划将移动到使绝对的导入成为默认的细节在其他版本的python中。
我们假设你有一个包目录,像下面这样:

pkg/
pkg/__init__.py
pkg/main.py
pkg/string.py

上面定义了一个包称为 pkg 包含 pkg.main 和pkg.string 两个子模块。考虑在‘main.py'中的代码,什么事情会发生如果我们执行语句 import string 在python2.4或者更早的版本?他将会查询包的目录执行一个相对的import,找到pkg/string.py ,导入文件的内容作为pkg.string模块,这个模块的边界的名字是'string'在pkg.main模块中的名称空间。
如果pkg.string是你想要的这个非常不错。但是如果你仅仅想要的是python的基本的string模块?
没有清楚的方法忽略pkg.string以及寻找基本的模块;一般情况下你不得不去查看sys.modules中的内容,那有一点稍微的不清楚。Holger Krekel的py.std包提供了一个整齐的方法执行从基本库中导入的方法,improt py;py.std.string.jion(),但是那个包在python的安装过程是是不可用的。

阅读代码在相对导入方面也是不够清晰的,因为读者可能混淆string和pkg.string模块使用。Python用户可以马上知道那是不同的名称在基本库和自己的包模块之间,但是你不能保护你自己的子模块名字在一个新版本的python中。

从python2.5,你可以打开 import的行为直接去绝对导入使用一个 from __future__ import absolute_import 。这个绝对导入行为将成为一个默认的细节在将来的python中。一旦绝对导入被默认,import string 将总是寻找基本库。建议用户尽可能多的使用绝对导入,因此在你的代码中使用from pkg improt string是适宜的。在python2.*版本中需要:

from __future__ import absolute_import

示例1:
例如:在模块A.B.C中的代码:

from . import D     # 导入A.B.D
from .. import E    # 导入A.E
from ..F import G    # 导入A.F.G,.. 和 F是连着的,中间没有空格

.代表当前目录,..代表上一层目录,...代表上上层目录。

示例2:

目录结构:

package/
 __init__.py
 subpackage1/
  __init__.py
  moduleX.py
  moduleY.py
 subpackage2/
  __init__.py
  moduleZ.py
 moduleA.py

在subpackage1/moduleX.py 或者 subpackage1/__init__.py中可以这样导入module:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

注意,from ...sys import path是合法的,但是不建议。直接from sys import path就行了。

Python 相关文章推荐
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
Python中创建字典的几种方法总结(推荐)
Apr 27 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
python实现最小二乘法线性拟合
Jul 19 Python
python解析yaml文件过程详解
Aug 30 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
python RSA加密的示例
Dec 09 Python
Python list去重且保持原顺序不变的方法
Apr 03 Python
浅谈Python协程asyncio
Jun 20 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 #Python
深入解析Python中的__builtins__内建对象
Jun 21 #Python
浅谈Python中函数的参数传递
Jun 21 #Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 #Python
常见python正则用法的简单实例
Jun 21 #Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 #Python
简单讲解Python编程中namedtuple类的用法
Jun 21 #Python
You might like
php access 数据连接与读取保存编辑数据的实现代码
2010/05/12 PHP
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
2012/02/10 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python os模块介绍
2014/11/30 Python
Django实现学员管理系统
2019/02/26 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python实现UDP协议下的文件传输
2020/03/20 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
应届生人事助理求职信
2013/11/09 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
大学生村官承诺书
2014/03/28 职场文书
驾驶员安全责任书
2014/07/22 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
会议营销主持词
2015/07/03 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
选购到合适的激光打印机
2022/04/21 数码科技
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android