【问题标题】:Initialize/import submodules without polluting the global namespace初始化/导入子模块而不污染全局命名空间
【发布时间】:2019-05-02 22:29:32
【问题描述】:

通常,当我导入模块时,我更喜欢只导入顶层模块并将所有内容都视为其中的成员,而不是将我需要的每个函数都导入到全局命名空间中,即:

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

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

【问题讨论】:

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


    【解决方案1】:
    import sklearn as skl
    import sklearn.cluster
    

    import 后面的名称必须是模块的实际名称,而不是别名。这确实意味着您最终会得到 sklearn 名称以及绑定到 sklearn 模块对象的 skl 名称。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2020-01-03
      相关资源
      最近更新 更多