Инициализация / импорт подмодулей без загрязнения глобального пространства имен

1

Обычно, когда я импортирую модули, я предпочитаю просто импортировать верхний модуль и рассматривать все как часть этого, вместо импорта каждой функции, которая мне нужна, в глобальное пространство имен, то есть:

import os
os.walk()

вместо:

from os import walk
walk()

Тем не менее, я недавно сталкивался с модулями, которые имеют подмодули, которые, по-видимому, должны импортироваться глобально для запуска. Например, модуль Scikit-Learn содержит подмодуль "кластер". Я хочу сделать это:

import sklearn as skl
skl.cluster.KMeans(...)

но это вызывает ошибку, потому что я не инициализировал sklearn.cluster. Вместо этого я видел это:

from sklearn import cluster
cluster.KMeans(...)

Мне это действительно не нравится, потому что мне не нравится загрязнять мое глобальное пространство имен. Есть ли способ обойти это? Я попробовал это:

import sklearn as skl
import skl.cluster

но это тоже не работает. Как я могу инициализировать подмодуль, не импортируя его глобально?

Теги:
python-3.x
import
python-import

1 ответ

1
import sklearn as skl
import sklearn.cluster

Имя после import должно быть фактическим именем модуля, а не псевдонимом. Это означает, что в конечном итоге вы sklearn имя sklearn а также имя skl связанное с sklearn модуля sklearn.

Там нет импорта, который будет инициализировать sklearn.cluster и связать skl имя к sklearn модуля. Самое близкое, что вы можете сделать, это del sklearn после импорта подмодулей или del sklearn импорта инициализации подмодуля где-то там, где они не будут связывать имена в этом пространстве имен, например, специальную функцию или модуль или что-то в этом роде (но утаивание таких импорта имеет свои проблемы), или используйте importlib.import_module для загрузки подмодулей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню