详解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编写爬虫小程序
May 14 Python
详解Python迭代和迭代器
Mar 28 Python
python基于物品协同过滤算法实现代码
May 31 Python
python全栈知识点总结
Jul 01 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
python快速安装OpenCV的步骤记录
Feb 22 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常用函数小技巧
2008/09/11 PHP
php 中英文语言转换类代码
2011/08/11 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
javascript 写类方式之四
2009/07/05 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
破解安装Pycharm的方法
2018/10/19 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
大学生思想汇报范文
2013/12/31 职场文书
档案接收函
2014/01/13 职场文书
珠宝店促销方案
2014/03/21 职场文书
感恩之星事迹材料
2014/05/03 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
给客户的检讨书
2014/12/21 职场文书
感谢信模板大全
2015/01/23 职场文书
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript