0

我编写了两个模块 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()

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

4

1 回答 1

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 不能相信文件系统不会弄乱包中文件名的大小写。

于 2013-03-21T14:41:47.583 回答