我有一个模块,我在其中导入其他模块(通常为sys
或os
),当我导入模块时
import mymodule
如果我这样做
dir(mymodule)
我不仅获得了模块的子模块,还获得了os
等。
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'sys', 'submodule']
有没有办法避免让我的模块中导入的模块显示在模块的符号表中?是否有可能将其保密?
答案 0 :(得分:2)
好吧,您可以使用del
import os
# ... all other code here
del os
之后,在导入时它将不再可见。
然而,当模块实际使用时,这不会起作用......
答案 1 :(得分:1)
真的没有“私人”这样的东西。在Python中;如果要通信名称是私有的,请在名称上使用前导下划线。有经验的Python开发人员会理解这些名称不应该在模块之外使用。
dir()
(实际上是一个调试工具)向您展示模块的全局命名空间,您不必担心在该列表中看到导入的模块;这完全正常。该模块中的任何代码(在函数或生成器表达式中)使用sys
或os
或submodule
作为全局名称,从该命名空间解析引用。因此,您想这些名称可供您的代码继续使用。
您可以在全局命名空间中创建名为__all__
的序列,以列出您希望其他人在您的模块中使用的所有名称。 dir()
无法使用它,但from mymodule import *
和help(mymodule)
之类的语法确实遵循了这一序列。
你也可以给你导入的那些模块'私人'名称:
import os as _os
import sys as _sys
并更新代码中的所有引用以使用这些更新的名称。如果您尚未设置__all__
,那么from mymodule import *
和help(mymodule)
将至少忽略以下划线开头的名称。
如果您只在顶层使用这些模块,那么您可以随时使用del os
或del sys
,并且代码中的任何函数都不要求这些名称作为全局变量存在。