python模块包

除了模块名之外,导入也可以指定目录路径。Python代码的目录就称为包,因此,这类 导入就称为包导入。事实上,包导入是把计算机上的目录变成另一个Python命名空间, 而属性则对应于目录中所包含的子目录和模块文件。

这是有点高级的特性,但是它所提供的层次,对于组织大型系统内的文件会很方便,而 且可以简化模块搜索路径的设置。我们将知道,当多个相同名称的程序文件安装在某一 机器上时,包导入也可以偶尔用来解决导入的不确定性。

包导入基础

包导入是如何运作的。在import语句中列举简单文件名的地方,可以改成列出 路径的名称,彼此以点号相隔。

import dir1.dir2.mod

from语句也是一样的

from dir1.dir2.mod import x

这些语句中的 “点号” 路径是对应于机器上目录层次的路径,通过这个路径可以获得到文件mod.py (或类似文件,扩展名可能会有变化)。也就是说,上面的语句是表明了机器上有个目录dir1,而dir1里有子目录dir2,而dir2内包含有一个名为mod.py (或类似文件)的模块文件。

此外,这些导入意味着,dir1位在某个容器目录dir0中,这个目录可以在Python模块搜索路径中找到。换句话说,这两个import语句代表了这样的目录结构(以DOS反斜线分隔字符显示)。

dir0\dirl\dir2\mod.py	# Or mod.pyc, mod.so, etc.

容器目录dir0需要添加在模块搜索路径中(除非这是顶层文件的主目录),就好像dir1是模块文件那样。
一般地,包导入路径中最左边的部分仍然是相对干我们在sys.path模块搜索路径列表中的一个目录。从此以后,脚本内的import语句明确指出找到模块的目录路径。

包和搜索路径设置
要记住import语句中的目录路径只能是以点号间隔的变量。你不能在import语句中使用任何平台特定的路径语法。

__ init__.py包文件

如果选择使用包导入,就必须多遵循一条约束:包导入语句的路径中的每个目录内都必须有—这个__init..py文件,否则导入包会失败。也就是说,在我们所采用的例子中,dirl1和dir2内都必须包含__init.py这个文件。容器目录dir0不需要这类文件,因为其本身没列在import语句之中。更正式说法是,像这样的目录结构:

dir0\dirl\dir2\mod.py

以及这种形式的import语句:

import dir1.dir2.mod

都必须遵循下列规则:
• dir1和dir2中必须都含有一个__init__.py文件。
• dir0是容器,不需要__init__.py文件;如果有的话,这个文件也会被忽略。
• dir0(而非dir0\dirl)必须列在模块搜索路径上(也就是此目录必须是主目录,或者列在PYTHONPATH之中)。

__ init__.py可以包含Python程序代码,就像普通模块文件。这类文件从某种程度上讲就像是Python的一种声明,尽管如此,也可以完全是空的。作为声明,这些文件可以防止有相同名称的目录不小心隐藏在模块搜索路径中,而之后才出现真正所需要的模块。没有这层保护,Python可能会挑选出和程序代码无关的目录,只是因为有一个同名的目录刚好出现在搜索路径上位置较前的目录内。

如果刚学Python,确认已经精通了简单的模块,才能进入包的领域,因为这里有些高级 的功能。然而,包也扮演了重要的角色,尤其是在较大程序中:包让导入更具信息性, 并可以作为组织工具,简化模块的搜索路径,而且可以解决模糊性。

首先,因为包导入提供了程序文件的目录信息,因此可以轻松地找到文件,从而可以作 为组织工具来使用。没有包导入时,通常得通过査看模块搜索路径才能找出文件。再者,如果根据功能把文件组织成子目录,包导入会让模块扮演的角色更为明显,也使代码更具可读性。例如,正常导入模块搜索路径上某个目录内的文件时,就像这样:

import utilities

与下面包含路径的导入相比,提供的信息就更少:

import database.client.utilities

包导入也可以大幅简化PYTHONPATH和 .pth文件搜索路径设置。实际上,如果所有跨目录的导入,都使用包导入,并且让这些包导入都相对于一个共同的根目录,把所有Pylhon 程序代码都存在其中,在搜索路径上就只需一个单独的接入点:通用的根目录。最后, 包导入让你想导入的文件更明确,从而解决了模糊性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值