【发布时间】:2019-01-11 17:29:20
【问题描述】:
我是 Python 的初学者,我对模块对象如何绑定到包的 __init__.py 命名空间有疑问。
我会用一些代码更清楚地说明问题。
假设有一个名为myPkg 的包,包含两个模块:firstMod 和secondMod:
myPkg\
__init__.py
firstMod.py
secondMod.py
文件__init__.py如下:
def myFun():
from . import firstMod as fm
myFun()
文件firstMod 为空。
文件secondMod如下:
def myFun():
from . import firstMod as fm
myFun()
现在,在与myPkg 相同的目录中运行 Python 2.7.15 解释器,然后执行以下操作:
>>> import myPkg
>>> dir(myPkg)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'firstMod', 'myFun']
>>> from myPkg import secondMod
>>> dir(secondMod)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'myFun']
>>>
虽然dir(secondMod) 的结果在意料之中,但dir(myPkg) 的结果却出乎意料(对我而言)。似乎,仅对于包的 __init__.py 模块,即使模块是从函数中导入的,导入的模块对象的名称也会绑定到全局命名空间。这在其他模块中不会发生。
编辑:事实证明,这只发生在导入包的模块时。从myFun 导入外部模块不会导致__init__.py 中的名称绑定。
谁能解释为什么会这样? 还有:有没有办法避免这种行为?
编辑
请注意,'firstMod' 在__init__.py 的全局命名空间中的存在是仅适用于包的属性。
其实如果一个定义了两个模块:
zeroMod.py
firstMod.py
在任何包之外,并在zeroMod.py 中填写:
def myFun():
import firstMod as fm
myFun()
解释器不会将名称'firstMod'绑定到zeroMod.py的全局命名空间,即使是第一次加载firstMod.py:
>>> import zeroMod
>>> dir(zeroMod)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'myFun']
>>>
我不明白为什么__init__.py 会发生名称绑定,而zeroMod.py 不会发生名称绑定。
【问题讨论】:
标签: python python-2.7 python-import