这可能是一个更普遍的问题,因为我在其他模块上看到了类似的行为。但是我将在模块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中有效的“属性”和“模块”?
答案 0 :(得分:2)
matplotlib
本身并非import .dates
。 dir()
显示的是对象的属性列表。如果matplotlib
不是import .dates
,则dates
模块对象上没有本地名称matplotlib
。
现在,如果您执行import matplotlib.dates
,则Python的导入系统会将其解析为文件/文件夹matplotlib/dates.py
或matplotlib/dates/__init__.py
(以存在者为准)。需要强调的是,matplotlib
本身与该文件的解析无关,因此不需要以任何方式“知道”该子模块的存在。
如果加载模块,它不会自动加载所有可能的子模块。只有在某些东西明确import
那个名字的情况下,这种情况才会发生。