Python模块:如何保持私有符号表的私有性?

时间:2014-12-08 09:47:37

标签: python module

我有一个模块,我在其中导入其他模块(通常为sysos),当我导入模块时

import mymodule

如果我这样做

dir(mymodule)

我不仅获得了模块的子模块,还获得了os 等。

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'sys', 'submodule']

有没有办法避免让我的模块中导入的模块显示在模块的符号表中?是否有可能将其保密?

2 个答案:

答案 0 :(得分:2)

好吧,您可以使用del

从命名空间中删除该模块
import os

# ... all other code here

del os

之后,在导入时它将不再可见。

然而,当模块实际使用时,这不会起作用......

答案 1 :(得分:1)

真的没有“私人”这样的东西。在Python中;如果要通信名称是私有的,请在名称上使用前导下划线。有经验的Python开发人员会理解这些名称不应该在模块之外使用。

dir()(实际上是一个调试工具)向您展示模块的全局命名空间,您不必担心在该列表中看到导入的模块;这完全正常。该模块中的任何代码(在函数或生成器表达式中)使用sysossubmodule作为全局名称,从该命名空间解析引用。因此,您这些名称可供您的代码继续使用。

您可以在全局命名空间中创建名为__all__的序列,以列出您希望其他人在您的模块中使用的所有名称。 dir()无法使用它,但from mymodule import *help(mymodule)之类的语法确实遵循了这一序列。

你也可以给你导入的那些模块'私人'名称:

import os as _os
import sys as _sys

并更新代码中的所有引用以使用这些更新的名称。如果您尚未设置__all__,那么from mymodule import *help(mymodule)将至少忽略以下划线开头的名称。

如果您只在顶层使用这些模块,那么您可以随时使用del osdel sys,并且代码中的任何函数都不要求这些名称作为全局变量存在。