簡體   English   中英

從 python 中刪除導入的模塊

[英]Remove imported modules from python

如果我有一個名為“xtraimport.py”的 python 文件,其中包含以下內容:

import os
import sys

def its_true():
    return True

當我導入它時,它包含符號“os”和“sys”:

In [3]: import xtraimport
In [4]: dir(xtraimport)
Out[4]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'its_true',
 'os',
 'sys']

有什么辦法可以消除命名空間污染? 我知道符號是在我的模塊中導入的,但我不想將它們暴露給使用該庫的每個人。

對此進行一些控制的一種方法是將您的模塊變成 package。 在 python 路徑上,創建xtraimport 在該目錄中放置兩個文件:(1) xtraimport.py和 (2) __init__.py 對於__init__.py的內容,使用:

from xtraimport import its_true

這樣,只有its_true直接暴露出來了:

In [1]: import xtraimport

In [2]: dir(xtraimport)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'its_true',
 'xtraimport']

xtraimport的全部內容仍然可供願意采取額外步驟的專用用戶使用:

In [3]: dir(xtraimport.xtraimport)
Out[3]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'its_true',
 'os',
 'sys']

更輕松? 可能不是。 但是,如果您喜歡,這里有一個解決方案。

import xtraimport
import sys
originalDir = dir(xtraimport)
newDir      = [x for x in originalDir if x not in sys.modules]

在這里查看有關sys.modules的更多詳細信息: sys.modules

設置__all__允許您指定希望模塊的公共接口包含哪些名稱。 它實際上並沒有阻止其他人被訪問,但它會影響from foo import * , pydoc ,並且它可能會影響自動完成,具體取決於自動完成軟件。

例如:

__all__ = ["my_function", "MyClass"]

要刪除導入的模塊,例如,如果我要刪除導入的 cv2 模塊,我可以這樣做(Python 3.9):

我可以看到 cv2 已導入: print(dir())現在刪除 cv2: del cv2再次檢查: print(dir())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM