tl;dr: 你不能干净利落。或者更准确地说,你不应该担心这样的事情。
没有namespace collisions
在这种情况下,由于 os 模块是在该名称下加载的pkg.agg_clean.os
。如果用户想要使用您导入的操作系统包,让他们这样做也没有什么坏处。除此之外,没有good阻止他们这样做的方法。
这里有一些有趣的事情值得记住。获取可以由另一个 python 脚本导入的以下 python 模块:
# module_im_importing.py
import os as _os
__all__ = ["echo"]
name_not_available = 'some_constant_string'
def echo(object):
pass
如果您的用户使用导入裸模块import module_im_importing
,所有定义的变量都可以在其环境中使用module_im_importing
.
>>> import module_im_importing
>>> dir() # Lookup local namespace
['__builtins__', '__doc__', '__name__', '__package__', 'module_im_importing']
>>> dir(module_im_importing) # See defined items in your package.
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'echo', 'name_not_available', 'os']
如果他们改为from module_im_importing import *
(这是不鼓励的),行为有点不同:
>>> from module_im_importing import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'echo']
这会导致文件中定义的名称module_im_importing.py
要导入到用户的本地命名空间中。因为我们用过__all__
在您的模块中,仅定义在__all__
从您的模块导入到用户本地命名空间。例如,如果您定义了一个类似的函数,这可能会污染它们的名称空间echo
这与他们可能使用的另一个包冲突。
这就是为什么通配符导入在PEP8 http://legacy.python.org/dev/peps/pep-0008/#imports。来自文档:
Wildcard imports (from <module> import *) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools.
无论如何,请不要为这样的事情担心。如果您的模块的用户不遵循 PEP8,这只是一个问题,并且无论如何他们都应该被告知他们的错误。请记住,在 Python 中,We're all consenting adults here
.