我编写了两个模块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()
这是正常的,还是我在代码中导入模块时应该考虑的事项?
答案 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不能信任文件系统,不会弄乱软件包包含的文件名的大小写。