假设我有一个包含模块的包:
SWS/
__init.py__
foo.py
bar.py
time.py
模块之间需要引用彼此包含的函数。似乎我的time.py
模块遇到了问题,因为有一个标准模块使用相同的名称。
例如,在我的foo.py
模块需要我的SWS.time
模块和标准python time
模块的情况下,我遇到了问题,因为解释器在遇到标准time
模块之前会查看包内部并找到我的time.py
模块。
有办法解决这个问题吗?这是一种不允许使用的情况吗?模块名不应该被重用吗?
任何关于包装理念的解决方案和意见在这里都是有用的。
Tags:
正如其他人所说,这通常是一个坏主意。
也就是说,如果你正在寻找潜在的解决方法,或者更好地理解问题,我建议你阅读以下问题:
Importing from builtin library when module with same name exists
How to access a standard-library module in Python when there is a local module with the same name?
重用标准函数/类/模块/包的名称从来不是一个好主意。尽量避免。不过,对于你的情况有一些干净的解决方法。
导入
SWS.time
而不是stdlibtime
所看到的行为是由于古python版本(2.x)中import
的语义所致。要修复它,请添加:在文件的最上面。这将把
import
的语义更改为python3.x的语义,后者更为合理。在这种情况下,声明:将只引用顶级模块。因此,解释器在包内执行导入时不会考虑您的
SWS.time
模块,但它只使用标准库模块。如果您的包中的模块需要导入
SWS.time
,您可以选择:使用显式相对导入:
使用绝对导入:
所以,你的
foo.py
应该是:这取决于您使用的Python版本。如果您的目标Python版本是2.4或更高版本(在2015年,我当然希望不是),那么是的,这将是一个糟糕的做法,因为没有方法(没有黑客)来区分这两个模块。
然而,在Python 2.5+中,我认为在包名称空间中重用标准lib模块名是非常好的;事实上,这就是the spirit of PEP328。
SWS.time
显然与time
不同,作为代码的读者,我希望SWS.time
不仅使用time
,而且以某种方式扩展它。因此,如果
SWS.foo
需要导入SWS.time
,那么它应该使用绝对路径:或者,它应该使用一个显式相对导入,正如巴库鲁的回答:
如果需要在
SWS.time
模块中导入标准libtime
模块,则首先需要导入未来的功能(仅适用于Python 2.5+;Python 3+在默认情况下执行此操作):注意:
from __future__ import absolute_imports
只会影响未来功能被导入的模块内的import语句,而不会影响任何其他模块(因为如果另一个模块依赖于相对导入,这将是有害的)。相关问题 更多 >
编程相关推荐