【发布时间】:2016-06-17 23:22:40
【问题描述】:
据我所知,当其中一个模块未导入时,我不明白为什么以下运行 (Python 2.7)
# \sound\formats\script.py
import formats.wavread
print formats.wavread.foo()
print formats.wavwrite.boo()
我的目录结构是
sound\
__init__.py
formats\
__init__.py
script.py
wavread.py
wavwrite.py
__init__.py 都是空的。其余的代码如下
# \sound\formats\wavread.py
import wavwrite # <-- unused import
def foo():
return "read foo"
# \sound\formats\wavwrite.py
def boo():
return "write boo"
script.py 运行良好,尽管在我的理解中模块wavwrite.py 没有被导入。然而,我猜想它是在执行import formats.wavread 语句时以某种方式导入的,因为wavread.py 模块中有一个import wavwrite 行。我的印象是这个导入 import wavwrite 完全没用,但它会绑定到 wavread 模块的全局命名空间。因此wavwrite.boo() 方法将超出范围并且无法从script.py 内部访问。显然它不是那样工作的。
从script.py 模块的代码中删除子包前缀看起来可以使程序按我的预期工作。因此,如果您运行以下命令
#\sound\formats\script.py
import wavread
print wavread.foo()
print wavwrite.boo()
将通过打印出 read foo 来执行 wavread.foo() 方法,并在下一行遇到错误,它会丢弃消息 NameError: name 'wavwrite' is not defined,因为正如预期的那样,wavwrite 模块尚未导入。
请问这里到底发生了什么以及import formats.wavread 与import wavread 有何不同?
【问题讨论】:
标签: python import namespaces