10.2 探索模块
介绍一些标准库模块前,先来说说如何探索模块。这是一种很有用的技能,因为在你的Python程序员职业生涯中,将遇到很多很有用的模块,而这里无法一一介绍。当前的标准库很大,足以编写专著来论述(市面上也确实有这样的专著),而且还在不断增大。每个新Python版本都新增了模块,通常还会对一些既有模块进行细微的修改和改进。另外,你在网上肯定会找到一些很有
用的模块。如果能快速而轻松地理解它们,编程工作将有趣得多。
10.2.1 模块包含什么
要探索模块,最直接的方式是使用Python解释器进行研究。为此,首先需要将模块导入。假设你听说有一个名为copy的标准模块。
>>> import copy
没有引发异常,说明确实有这样的模块。但这个模块是做什么用的呢?它都包含些什么呢?
1. 使用dir
要查明模块包含哪些东西,可使用函数dir,它列出对象的所有属性(对于模块,它列出所有的函数、类、变量等)。如果将dir(copy)的结果打印出来,将是一个很长的名称列表(请试试看)。在这些名称中,有几个以下划线打头。根据约定,这意味着它们并非供外部使用。有鉴于此,我们使用一个简单的列表推导将这些名称过滤掉(如果你忘记了列表推导的工作原理,请参阅5.6节)。
>>> [n for n in dir(copy) if not n.startswith('_')]
['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref']
结果包含dir(copy)返回的不以下划线打头的名称,这比完整清单要好懂些。
2. 变量__all__
在前一节中, 我使用简单的列表推导来猜测可在模块copy中看到哪些内容,然而可直接咨询这个模块来获得正确的答案。你可能注意到了,在dir(copy)返回的完整清单中,包含名称__all__。这个变量包含一个列表,它与前面使用列表推导创建的列表类似,但是在模块内部设置的。下面来看看这个列表包含的内容:
>>> copy.__all__
['Error', 'copy', 'deepcopy']
前面的猜测不算太离谱,只是多了几个并非供用户使用的名称。这个__all__列表是怎么来的呢?为何要提供它?第一个问题很容易回答:它是在模块copy中像下面这样设置的(这些代码是直接从copy.py复制而来的):
__all__ = ["Error", "copy", "deepcopy"]
为何要提供它呢?旨在定义模块的公有接口。具体地说,它告诉解释器从这个模块导入所有的名称意味着什么。因此,如果你使用如下代码:
from copy import *
将只能得到变量__all__中列出的4个函数。要导入PyStringMap,必须显式地:导入copy并使用copy.PyStringMap; 或者使用from copy import PyStringMap。
编写模块时,像这样设置__all__也很有用。因为模块可能包含大量其他程序不需要的变量、函数和类,比较周全的做法是将它们过滤掉。如果不设置__all__,则会在以import *方式导入时,导入所有不以下划线打头的全局名称。
领取专属 10元无门槛券
私享最新 技术干货