如果我有一个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']
有没有办法消除名称空间污染?我知道符号是在我的模块中导入的,但我不想将它们暴露给使用该库的每个人。
答案 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.modules
:sys.modules
答案 2 :(得分:0)
设置__all__
可以指定您希望模块的公共接口包含哪些名称。它实际上并不会阻止其他人访问,但它会影响from foo import *
,pydoc,并且可能会影响自动完成功能,具体取决于自动完成软件。
E.g:
__all__ = ["my_function", "MyClass"]