Скрыть внешние модули при импорте модуля (например, относительно завершения кода)
У меня есть несколько модулей в одном пакете (своего рода набор инструментов), которые я использую в своих проектах. Структура выглядит так:
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
пусто, как предлагают многие питонисты, или это способ сделать это?
3 ответа
У меня была та же проблема, и я решил ее, добавив подчеркивание ко всему моему импорту. Это не выглядит блестящим, но оно достигает того, что вы ищете.
from __future__ import division as _division
import numpy as _np
import pandas as _pd
Только материал, который начинается без подчеркивания, импортируется при импорте модуля с использованием из.. import *. или когда вы используете табуляцию в IPython или spyder.
Я пришел, чтобы полюбить и использовать этот подход. Начиная со структуры вашего проекта, мы будем скрывать весь контент 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
и его содержание.
Альтернативное решение, которое я придумал, - реализовать короткий класс API в __init__
файл, который может использовать __all__
переменная (которая уже может быть определена для import *
целей). Что-то вроде этого в__init__.py
:
import matrix_kit
class _matrix_kit_API:
def __init__(self):
for func in matrix_kit.__all__:
setattr(self, func, eval(f"matrix_kit.{func}"))
matrix_kit = _matrix_kit_API()