Обычно, когда я импортирую модули, я предпочитаю просто импортировать верхний модуль и рассматривать все как часть этого, вместо импорта каждой функции, которая мне нужна, в глобальное пространство имен, то есть:
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
но это тоже не работает. Как я могу инициализировать подмодуль, не импортируя его глобально?
import sklearn as skl
import sklearn.cluster
Имя после import
должно быть фактическим именем модуля, а не псевдонимом. Это означает, что в конечном итоге вы sklearn
имя sklearn
а также имя skl
связанное с sklearn
модуля sklearn
.
Там нет импорта, который будет инициализировать sklearn.cluster
и связать skl
имя к sklearn
модуля. Самое близкое, что вы можете сделать, это del sklearn
после импорта подмодулей или del sklearn
импорта инициализации подмодуля где-то там, где они не будут связывать имена в этом пространстве имен, например, специальную функцию или модуль или что-то в этом роде (но утаивание таких импорта имеет свои проблемы), или используйте importlib.import_module
для загрузки подмодулей.