代码之家  ›  专栏  ›  技术社区  ›  Ian

在不污染全局命名空间的情况下初始化/导入子模块

  •  1
  • Ian  · 技术社区  · 7 年前

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

    import os
    os.walk()
    

    而不是:

    from os import walk
    walk()
    

    然而,我最近遇到了一些模块,它们的子模块似乎必须全局导入才能运行。例如,Scikit学习模块包含“集群”子模块。我想这样做:

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

    但这会抛出一个错误,因为我没有初始化 sklearn.cluster . 相反,我看到的是:

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

    我真的不喜欢这样,因为我不喜欢污染我的全局名称空间。这有什么办法吗?我试过这个:

    import sklearn as skl
    import skl.cluster
    

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   user2357112    7 年前
    import sklearn as skl
    import sklearn.cluster
    

    后面的名字 import 必须是模块的实际名称,而不是别名。这意味着你最终会得到 sklearn skl 名称绑定到

    没有将初始化的导入 sklearn.cluster 捆绑 skl 姓名 sklearn del sklearn 在导入子模块之后,或者将子模块初始化导入推到某个不会绑定此命名空间中的名称的位置,例如专用函数或模块或其他东西(但隐藏这样的导入有其自身的问题),或者使用 importlib.import_module 加载子模块。