Python(2.7):如何避免导入的模块出现在我的模块中?
问题描述:
我写了两个模块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在我的代码中导入模块时是否意想不到?
答
通常您不需要担心在命名空间中可访问的内容。任何人如果对那些不属于模块记录的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不能相信文件系统不会混淆包中包含的文件名的大小写。