Скрыть внешние модули при импорте модуля (например, относительно завершения кода)

У меня есть несколько модулей в одном пакете (своего рода набор инструментов), которые я использую в своих проектах. Структура выглядит так:

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()

Вы можете получить некоторый пробег из __all__

Другие вопросы по тегам