簡體   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