首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python基础教程 模块包含什么

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 *方式导入时,导入所有不以下划线打头的全局名称。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190109G06CWD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券