详解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数据结构之Array用法实例
Oct 09 Python
Python的装饰器用法学习笔记
Jun 24 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
python 如何引入协程和原理分析
Nov 30 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
整理Python中常用的conda命令操作
Jun 15 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 Smarty模板生成html文档的方法
2010/04/12 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
js控制div及网页相关属性的代码
2009/12/19 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
对python周期性定时器的示例详解
2019/02/19 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
2014年创卫实施方案
2014/02/18 职场文书
幼儿园新年寄语
2014/04/03 职场文书
政府信息公开实施方案
2014/05/09 职场文书
双拥工作宣传标语
2014/06/26 职场文书
倡议书格式
2014/08/30 职场文书
社保转移委托书范本
2014/10/08 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
门卫管理制度范本
2015/08/05 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书