详解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在指定目录下查找gif文件的方法
May 04 Python
python采集百度百科的方法
Jun 05 Python
Python程序退出方式小结
Dec 09 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
python实现登录密码重置简易操作代码
Aug 14 Python
python将时分秒转换成秒的实例
Dec 07 Python
Python中Subprocess的不同函数解析
Dec 10 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
使用keras2.0 将Merge层改为函数式
May 23 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
php之readdir函数用法实例
2014/11/13 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
JS中的==运算: [''] == false —>true
2016/07/24 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
mac系统安装Python3初体验
2018/01/02 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
scrapy头部修改的方法详解
2020/12/06 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
构造器Constructor是否可被override?
2013/08/06 面试题
如何提高JDBC的性能
2013/04/30 面试题
为什么要做架构设计
2015/07/08 面试题
水产养殖学应届生求职信
2013/09/29 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
军训新闻稿范文
2015/07/17 职场文书
2015大一新生军训感言
2015/08/01 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python