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

为什么python子模块不显示在dir(模块)的列表中?,python,python-import,Python,Python Import,这可能是一个更一般的问题,因为我在其他模块中看到了类似的行为。但是,我将通过modulematplotlib显示我看到的问题。我认为dir(module)列出了指定模块的所有属性。因此,我可以做到以下几点: import matplotlib dir(matplotlib) 列出的结果中有“dateutil”,但“dates”不是由dir(matplotlib)列出的。但我会这样做: import matplotlib.dates ## why does this work? `dir(m

这可能是一个更一般的问题,因为我在其他模块中看到了类似的行为。但是,我将通过module
matplotlib
显示我看到的问题。我认为
dir(module)
列出了指定模块的所有属性。因此,我可以做到以下几点:

import matplotlib
dir(matplotlib)
列出的结果中有“dateutil”,但“dates”不是由
dir(matplotlib)
列出的。但我会这样做:

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.\u\u file\u
显示了一个甚至不在matplotlib目录中的文件。此外,我可以在文件
'/anaconda3/lib/python3.6/site packages/matplotlib/\uuuu init\uuuuuuuuuuuuuuuuupy'
中看到dateutil是由
matplotlib/\uuuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


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

简单地说
matplotlib
本身并不
导入.dates
dir()
显示的是对象的属性列表。如果
matplotlib
未导入.dates
,则
matplotlib
模块对象上没有本地名称
dates

现在,如果您导入matplotlib.dates,Python的导入系统会将其解析为文件/文件夹
matplotlib/dates.py
matplotlib/dates/_uinit\uuuuuu.py
,以存在的为准。需要强调的是,
matplotlib
本身与文件分辨率无关,因此不需要以任何方式“知道”该子模块的存在


如果加载一个模块,它也不会自动加载所有可能的子模块。只有当某个东西显式地导入该名称时才会发生这种情况。

matplotlib
(包)在matplotlib的
\uu init\uuuuuuuuuy.py
中不包含/声明
日期(包中的模块),而是从其中的标准库导入
dateutil
。所以你必须手动导入它。是的,我在看这个的时候得到了,但问题是:1。为什么会这样设置(子模块
日期
未在主模块中声明)?这样做的利弊是什么?2.有没有办法列出未直接导入或声明的子模块?3.有没有一种简单的方法(除了查看
matplotlib.dateutil.\uuuu文件\uuuuu
)可以让我知道dateutil子模块是由matplotlib导入的,而不是它的直接部分?首先,它不是属性。1:你读过那篇文章吗?对我来说很明显,因为matplotlib也是一个cli工具。2和3:除了阅读文档或浏览软件包之外,没有其他简单的方法,除非您根据自己的喜好更改源代码。他们的开发人员授予您访问该代码的权限,因此他们的源代码决定了大多数使用方法。运行
dir
实际上并不是发现模块的一种正式方式。对,有一秒钟我感到困惑。更正。