详解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 相关文章推荐
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
常用python编程模板汇总
Feb 12 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
Python3.6.0+opencv3.3.0人脸检测示例
May 25 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
django haystack实现全文检索的示例代码
Jun 24 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 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的5个入手程序
2006/11/23 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
php header函数的常用http头设置
2015/06/25 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
jQuery实现内容定时切换效果完整实例
2016/04/06 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
Python3实现的简单验证码识别功能示例
2018/05/02 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
Python实现直播推流效果
2019/11/26 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
python 进程池pool使用详解
2020/10/15 Python
Java如何格式化日期
2012/08/07 面试题
介绍一下Linux中的链接
2016/05/28 面试题
法律系毕业生自荐信范文
2014/03/27 职场文书
中秋寄语大全
2014/04/11 职场文书
公司口号大全
2014/06/11 职场文书
求职自我评价怎么写
2015/03/09 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS
gateway网关接口请求的校验方式
2021/07/15 Java/Android
Python编程super应用场景及示例解析
2021/10/05 Python