详解Python中的from..import绝对导入语句

yipeiwu_com6年前Python基础

相对或者绝对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一行代码解决矩阵旋转的问题

今天刷《剑指offer》的时候碰到这样一道题: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10...

Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例

Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例

本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能。分享给大家供大家参考,具体如下: 【吐槽】 网上的代码害死人,看着都写的言之凿凿,可运行就是...

c++生成dll使用python调用dll的方法

第一步,建立一个CPP的DLL工程,然后写如下代码,生成DLL 复制代码 代码如下:#include <stdio.h>     #d...

Python3使用TCP编写一个简易的文件下载器功能

Python3使用TCP编写一个简易的文件下载器功能

利用Python3来实现TCP协议,和UDP类似。UDP应用于及时通信,而TCP协议用来传送文件、命令等操作,因为这些数据不允许丢失,否则会造成文件错误或命令混乱。下面代码就是模拟客户端...

python的random模块及加权随机算法的python实现方法

random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串。 •random.seed(x)改变随机数生成器的种子seed。 一般不必特别去设定seed,Pyt...