详解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 相关文章推荐
numpy.linspace 生成等差数组的方法
Jul 02 Python
Django model反向关联名称的方法
Dec 15 Python
Python秒算24点实现及原理详解
Jul 29 Python
python 字符串常用函数详解
Sep 11 Python
Python中关于浮点数的冷知识
Sep 22 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
jquery插件开发方法(初学者)
2012/02/03 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python实现彩票系统
2020/06/28 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
python从Oracle读取数据生成图表
2020/10/14 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
金融管理毕业生求职信
2014/03/03 职场文书
学校运动会霸气口号
2014/06/07 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
募捐感谢信
2015/01/22 职场文书