这取决于您使用的 Python 版本。如果您的目标 Python 版本是 2.4 或更早版本(2015 年,我当然希望不是),那么是的,这将是不好的做法,因为没有办法(没有黑客)来区分这两个模块。
但是,在 Python 2.5+ 中,我认为在包命名空间中重用标准 lib 模块名称是非常好的;其实这就是PEP328的精神。
随着 Python 库的扩展,越来越多的现有包内部模块突然意外地隐藏了标准库模块。这是包内部的一个特别困难的问题,因为无法指定哪个模块是指的。为了解决歧义,建议 foo 始终是可从 sys.path 访问的模块或包。这称为绝对导入。
python-dev 社区选择绝对导入作为默认值,因为它们是更常见的用例,并且因为绝对导入可以提供相对(包内)导入的所有功能——尽管在重命名包块时会以困难为代价在层次结构中向上或在将一个包移动到另一个包时。
因为这代表了语义的变化,所以绝对导入在 Python 2.5 和 2.6 中是可选的,通过使用from __future__ import absolute_import
SWS.time
显然与代码的读者不同,我希望不仅使用,而且以某种方式扩展它。time
SWS.time
time
所以,如果SWS.foo
需要 import SWS.time
,那么它应该使用绝对路径:
# in SWS.foo
# I would suggest renaming *within*
# modules that use SWS.time so that
# readers of your code aren't confused
# with which time module you're using
from SWS import time as sws_time
或者,它应该使用Bakuriu 的回答中的显式相对导入:
# in SWS.foo
from . import time as sws_time
如果您需要在模块中导入标准 libtime
模块SWS.time
,您首先需要导入未来的功能(仅适用于 Python 2.5+;Python 3+ 默认情况下会这样做):
# inside of SWS.time
from __future__ import absolute_import
import time
time.sleep(28800) # time for bed
注意: from __future__ import absolute_imports
只会影响导入未来功能的模块中的导入语句,不会影响任何其他模块(因为如果另一个模块依赖于相对导入,那将是有害的)。