为什么python子模块未显示在dir(module)的列表中?

时间:2018-10-22 01:44:43

标签: python python-import

这可能是一个更普遍的问题,因为我在其他模块上看到了类似的行为。但是我将在模块matplotlib中看到这个问题。我认为dir(module)列出了指定模块的所有属性。因此,我可以执行以下操作:

import matplotlib
dir(matplotlib)

其中列出的结果为'dateutil',但dir(matplotlib)未列出'dates'。但是然后我这样做:

import matplotlib.dates   ## why does this work? `dir(matplotlib)` did not list it
dir(matplotlib)           ## this now lists both 'dates' and 'dateutil'

为什么dir(matplotlib)现在将“日期”列为其属性之一?

这是怎么回事?

我现在才注意到,在我看来dateutil实际上不是matplotlib的一部分,而是由matplotlib导入的:

In [11]: matplotlib.dateutil.__file__
Out[11]: '/anaconda3/lib/python3.6/site-packages/dateutil/__init__.py'

In [12]: matplotlib.__file__
Out[12]: '/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py'

In [13]: matplotlib.dates.__file__
Out[13]: '/anaconda3/lib/python3.6/site-packages/matplotlib/dates.py'

在上面的输出中,matplotlib.dateutil.__file__会显示一个文件,该文件甚至不在matplotlib目录中。此外,我可以在文件'/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py'中看到matplotlib/__init__.py导入了dateutil。

因此,当我运行dir(module)时,有没有一种简单的方法来判断哪些属性是模块本身的一部分,以及哪些属性是由模块导入的?以及我怎么知道(除了阅读文档,或“ ls”到matplotlib目录之外),“ dates”也是matplotlib中有效的“属性”和“模块”?

1 个答案:

答案 0 :(得分:2)

matplotlib本身并非import .datesdir()显示的是对象的属性列表。如果matplotlib不是import .dates,则dates模块对象上没有本地名称matplotlib

现在,如果您执行import matplotlib.dates,则Python的导入系统会将其解析为文件/文件夹matplotlib/dates.pymatplotlib/dates/__init__.py(以存在者为准)。需要强调的是,matplotlib本身与该文件的解析无关,因此不需要以任何方式“知道”该子模块的存在。

如果加载模块,它不会自动加载所有可能的子模块。只有在某些东西明确import那个名字的情况下,这种情况才会发生。