Скрыть внешние модули при импорте модуля (например, в отношении завершения кода)
У меня есть несколько модулей в одном пакете (своего рода набор инструментов), который я использую в своих проектах. Структура выглядит следующим образом:
the_toolkit:
__init__.py
basic_io.py
simple_math.py
matrix_kit.py
...
Теперь, когда я использую IPython
или завершение кода в VIM
после импорта модуля из пакета с
from the_toolkit import matrix_kit
Я получаю кучу модулей/функций, которые matrix_kit.py
импортирует (array
, math
, log
, loggin
, format_exc
и т.д.) вместе с фактическими функциями, которые matrix_kit
определяет.
Как я могу отфильтровать все остальное, так как меня не интересует math
или array
в завершении кода модуля matrix_kit
?
__init__.py
пуст, как было предложено многими pythonistas, или это способ сделать это?
Ответы
Ответ 1
У меня была такая же проблема, и я решил ее, добавив главный подчеркивание ко всем моим импортам. Он не выглядит блестящим, но он достигает того, что вам нужно.
from __future__ import division as _division
import numpy as _np
import pandas as _pd
Только материал, который начинается без подчеркивания, импортируется при импорте модуля с использованием.. import *. или когда вы используете табуляцию в IPython или spyder.
Ответ 2
Я пришел, чтобы полюбить и использовать этот подход. Начиная со структуры вашего проекта, мы будем скрывать весь контент matrix_kit
который вы не хотите показывать.
the_toolkit:
__init__.py
basic_io.py
simple_math.py
matrix_kit.py
...
Переместите matrix_kit.py
в пакет с тем же именем и поместите одно подчеркивание в начале имени модуля:
the_toolkit:
__init__.py
basic_io.py
simple_math.py
matrix_kit:
__init__.py
_matrix_kit.py
...
Теперь в _matrix_kit.py
добавьте глобальную переменную __all__ = [...]
перечислены имена всех функций/классов/переменных, которые вы хотите видеть. Затем добавьте следующую строку в matrix_kit/__init__.py
:
from ._matrix_kit import *
Он будет импортировать только то, что указано в __all__
модуля. Затем, импортируя matrix_kit
как вы делали раньше, вы фактически импортируете __init__.py
и его содержимое.
Ответ 3
вы можете получить пробег из __all__