Вероятно, это более общий вопрос, потому что я видел подобное поведение с другими модулями.Но я покажу проблему, так как вижу ее с модулем matplotlib
.Я думал, что dir(module)
перечисляет все атрибуты указанного модуля.Поэтому я могу сделать следующее:
import matplotlib
dir(matplotlib)
Среди перечисленных результатов есть 'dateutil', но 'даты' НЕ перечислены 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.__file__
показывает файл, которого нет даже в matplotlibкаталог.Кроме того, в файле '/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py'
я вижу, что dateutil импортируется matplotlib/__init__.py
.
Итак, когда я запускаю dir(module)
, есть ли простой способ определить, какие атрибуты являются частью самого модуля, а какие были импортированы модулем?И как я мог знать (кроме чтения документации или «ls» в каталоге matplotlib), что «date» также является допустимым «атрибутом» и «модулем» в matplotlib?