почему субмодуль python не отображается в списке из dir (модуля)? - PullRequest
0 голосов
/ 22 октября 2018

Вероятно, это более общий вопрос, потому что я видел подобное поведение с другими модулями.Но я покажу проблему, так как вижу ее с модулем 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?

1 Ответ

0 голосов
/ 22 октября 2018

Просто matplotlib не само по себе import .dates.dir() показывает вам список атрибутов объекта.Если matplotlib не import .dates, тогда нет локального имени dates в объекте модуля matplotlib.

Теперь, если вы сделаете import matplotlib.dates, система импорта Python разрешит это в файл /папка matplotlib/dates.py или matplotlib/dates/__init__.py, в зависимости от того, что существует.Важно подчеркнуть, что matplotlib сам по себе не имеет ничего общего с этим разрешением файла и, следовательно, ему не нужно каким-либо образом "знать" о существовании этого подмодуля.

Если вы загружаете модуль, он делает not автоматически загружает также все возможные подмодули.Это происходит только в том случае, если что-то явно import с этим именем.

...