初始化/导入子模块而不会污染全局名称空间

时间:2018-11-30 18:37:47

标签: python python-3.x import python-import

通常,当我导入模块时,我更喜欢仅导入顶部模块并将所有模块视为该模块的成员,而不是将我需要的每个功能导入全局名称空间,即:

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

但这也不起作用。如何在不全局导入子模块的情况下初始化子模块?

1 个答案:

答案 0 :(得分:3)

import sklearn as skl
import sklearn.cluster

import之后的名称必须是模块的实际名称,而不是别名。这确实意味着您将以sklearn名称以及绑定到skl模块对象的sklearn名称结尾。

没有导入会初始化sklearn.cluster 并将绑定skl名称到sklearn模块。您可以执行的最接近的操作是在导入子模块之后del sklearn,或将子模块初始化导入推到它们不会在此命名空间中绑定名称的地方,例如专用函数或模块之类(但隐藏类似的导入具有其自己的问题),或使用importlib.import_module加载子模块。