详解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中的应用之translate和maketrans用法详解
Aug 27 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
Django模板语言 Tags使用详解
Sep 09 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
PyCharm中关于安装第三方包的三个建议
Sep 17 Python
Python如何批量生成和调用变量
Nov 21 Python
Python基础之常用库常用方法整理
Apr 30 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数据库操作类代码(增,删,改,查)
2013/04/08 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
2014/01/09 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
详解python调度框架APScheduler使用
2017/03/28 Python
python自动12306抢票软件实现代码
2018/02/24 Python
分分钟入门python语言
2018/03/20 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python continue语句实例用法
2020/02/06 Python
Python库安装速度过慢解决方案
2020/07/14 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
创业融资计划书
2014/04/25 职场文书
关于安全演讲稿
2014/05/09 职场文书
公司募捐倡议书
2014/05/14 职场文书
住房租房协议书
2014/08/20 职场文书
运动会加油稿20字
2014/11/15 职场文书
2014年行政工作总结
2014/11/19 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python