2013-03-21 80 views
0

我写了两个模块m1.py和m2.py,每个模块使用标准库中的各种模块。Python(2.7):如何避免导入的模块出现在我的模块中?

例如

#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() 

这是正常的,还是有一些我应该co在我的代码中导入模块时是否意想不到?

回答

1

通常您不需要担心在命名空间中可访问的内容。任何人如果对那些不属于模块记录的API的东西进行混淆,他们应该得到任何麻烦。 Python假定程序员是负责任的成年人。

例外情况是,您特别希望允许其他代码使用否则劝阻的from mymodule import *语法。然后你想限制什么是公开的,这样你就不会用你自己的内部东西来混淆你的进口商的名字空间。

这里是你如何能做到这一点:

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

  • 如果您希望将要导入的模块设置为私人模式,请使用as子句为其提供上述的“私人”名称。也就是说,使用import os as _os。或者,您可以创建一个__all__变量,明确列出模块的公用名称,而不是混乱地使用下划线。只有列表中的名称才会导入from mymodule import *声明。请注意,如果您希望子模块可通过from mypackage import *导入,则包中需要__all__序列。这是因为Python不能相信文件系统不会混淆包中包含的文件名的大小写。