繁体   English   中英

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

[英]Initialize/import submodules without polluting the global namespace

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

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.cluster 并将 skl名称绑定到sklearn模块。 导入子模块后,您可以执行的最接近的操作是del sklearn ,或者将子模块初始化导入推到某个地方,在这些地方,它们不会绑定此命名空间中的名称,例如专用函数或模块之类的东西(但是隐藏这样的导入具有其自身的问题) ,或使用importlib.import_module加载子模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM