Python(2.7):如何避免导入的模块作为模块的一部分出现?

时间:2013-03-21 13:44:32

标签: python-2.7 python-import

我编写了两个模块m1.py和m2.py,每个模块都使用标准库中的各种模块。

例如

#m1.py
import sys
#.
#.

#m2.py
import os
#.
#.

当我在main.py中导入两个模块m1.py和m2.py时,“困扰”我的是什么 我可以使用sys和os中定义的函数:

#main.py
print m1.sys.version
print m2.os.listdir()

这是正常的,还是我在代码中导入模块时应该考虑的事项?

1 个答案:

答案 0 :(得分:1)

通常,您不必担心命名空间中可以访问的内容。任何人都不知道那些不属于模块记录的API的东西应该得到任何麻烦。 Python假设它的程序员是负责任的成年人。

例外情况是您特别希望允许其他代码使用其他不鼓励的from mymodule import *语法。然后,您希望限制公开内容,这样您就不会使用自己的内部资源来混淆导入程序的命名空间。

以下是如何做到的:

  • 以下划线开头的名称(例如_foo)被假定为私有,并且不会导入from mymodule import *。这不是真实的"隐私,因为任何进行正常导入的人仍然可以通过mymodule._foo访问它们(但他们可能不应该!)。

  • 如果您想要将您要导入的模块设为私有,请使用as子句为其提供私有"如上所述的名称。也就是说,使用import os as _os

  • 或者,您可以创建一个明确列出模块公共名称的__all__变量,而不是乱用下划线。只会使用from mymodule import *语句导入列表中的名称。请注意,如果您希望子模块可以通过__all__导入,则包中需要from mypackage import *序列。这是因为Python不能信任文件系统,不会弄乱软件包包含的文件名的大小写。