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

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

import os
os.walk()

вместоиз:

from os import walk
walk()

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

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

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

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

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

import sklearn as skl
import skl.cluster

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

1 Ответ

0 голосов
/ 30 ноября 2018
import sklearn as skl
import sklearn.cluster

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

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

...