пакет импорта python – подпапка не должна отображаться в таблице символов

Мне интересно, почему каталог (subpackage), который содержит подмодули в пакете python, отображается как символ, когда пакет импортируется. Например, если у меня есть этот пакет:

PyModTest/ Top-level package __init__.py Initialize the package Source/ Subpackage holding source files __init__.py WildMod.py Submodule containing a function: 'WildFunc' 

где верхний уровень __init__.py выглядит так:

 #!/usr/bin/env python from Source.WildMod import WildFunc 

и, для полноты, нижний уровень __init__.py выглядит так:

 #!/usr/bin/env python __all__ = ["WildMod"] 

Итак, теперь я открываю интерпретатор, импортирую модуль и смотрю на символы:

 >>> import PyModTest >>> dir(PyModTest) ['Source', 'WildFunc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 

SEE, появляется модуль «Источник», хотя я его специально не импортировал!

Единственный символ (помимо частных), который я хочу увидеть, это мой «WildFunc». Есть ли способ скрыть пакет «Источник»?

  • Как присоединиться к смешанному списку (массив) (с целыми числами в нем) в Python?
  • Как сделать побитовые ворота NOR
  • Ошибка при запуске endpointscfg.py get_swagger_spec
  • Как получить токен доступа пользователя в Python
  • Python, override__getstate __ () и __setstate __ ()
  • ValueError: отрицательное число не может быть увеличено до дробной мощности
  • Прочитать файл в App Engine с помощью Python?
  • Подпроцесс Python Ctrl + C
  • One Solution collect form web for “пакет импорта python – подпапка не должна отображаться в таблице символов”

    Здесь есть две вещи:

    • В Python модули являются реальными объектами, а точка, которая отображается между их именами, представляет собой фактический доступ к атрибуту
    • Вы делаете относительный импорт, а это значит, что Source на самом деле является PyModTest.Source (благодаря TokenMacGuy для указания этого)

    Итак: для импорта PyModTest.Source.WildMod.WildFunc , Python должен

    1. импортировать PyModTest (который уже был сделан вами)
    2. проверьте, есть ли у него атрибут Source , а если нет, создайте атрибут, импортировав его из PyModTest/Source/__init__.py
    3. проверьте, есть ли у него атрибут WildMod , а если нет, создайте атрибут, импортировав его из PyModTest/Source/WildMod.py
    4. проверьте, есть ли у этого атрибута WildFunc (который он делает)

    Некоторые релевантные подробности обсуждаются в PEP 302 и в справочной системе Python .

    В механизме глубже вниз, импотенция имени разделена на компоненты. Для « import spam.ham » сначала выполняется « import spam », и только тогда, когда это удается, « ham » импортируется как подмодуль « spam ».

    Если вы не хотите иметь переменную с именем Source , это легко исправить: просто del Source после импорта функции. Но имейте в виду, что это предотвратит любой код, который запускается позже от доступа к PyModTest.Source.<anything> (за исключением WildFunc , так как вы сохранили ссылку на это). Я бы определенно предложил просто игнорировать ссылку на Source , а не удалять ее, так как это ничего не мешает.

    Python - лучший язык программирования в мире.