从python中删除导入的模块

时间:2014-08-06 21:05:06

标签: python module

如果我有一个python文件,名为" xtraimport.py"有这个:

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']

有没有办法消除名称空间污染?我知道符号是在我的模块中导入的,但我不想将它们暴露给使用该库的每个人。

3 个答案:

答案 0 :(得分:1)

获得某种控制权的一种方法是将您的模块放入包中。在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']

答案 1 :(得分:0)

更容易?可能不是。但如果您喜欢,这里就是一个解决方案。

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

请点击此处了解有关sys.modulessys.modules

的更多详情

答案 2 :(得分:0)

设置__all__可以指定您希望模块的公共接口包含哪些名称。它实际上并不会阻止其他人访问,但它会影响from foo import *,pydoc,并且可能会影响自动完成功能,具体取决于自动完成软件。

E.g:

__all__ = ["my_function", "MyClass"]