详解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使用正则表达式替换匹配成功的组
Nov 17 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
Python生成词云的实现代码
Jan 14 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
基于Python中random.sample()的替代方案
May 23 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
Python图片处理之图片裁剪教程
May 27 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之预定义接口详解
2015/07/29 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
Python实现二维有序数组查找的方法
2016/04/27 Python
浅谈Python中用datetime包进行对时间的一些操作
2016/06/23 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
Python 元组操作总结
2019/09/18 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
Django url 路由匹配过程详解
2021/01/22 Python
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
俞敏洪励志演讲稿
2014/04/29 职场文书
安全横幅标语
2014/06/09 职场文书
师德师风的心得体会
2014/09/02 职场文书
个人租房协议书
2014/11/28 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
python周期任务调度工具Schedule使用详解
2021/11/23 Python