我正在尝试理解Python中的包和模块名称屏蔽规则,并偶然发现了一个情况,我不明白为什么看到的结果是有意义的。这种情况发生在Python 2(使用from future import absolute_imports
)和Python 3。
假设我有以下文件夹结构:
├── mypackage
│ ├── argparse.py
│ └── __init__.py
└── script.py
mypackage
是我自定义的顶级包,其中我有一个模块覆盖了标准的 argparse
模块。在我的脚本中,我执行以下代码:
import argparse
print(argparse)
from mypackage.argparse import foo
print(argparse)
结果符合我的预期:
<module 'argparse' from '/usr/lib/python3.5/argparse.py'>
<module 'argparse' from '/usr/lib/python3.5/argparse.py'>
然而,如果我改变我的脚本以执行来自我的包的函数,并在我的包的
__init__.py
中执行相同的导入和打印语句,即:
脚本:
from mypackage import main
main()
__init__.py
:
import argparse
print(argparse)
from mypackage.argparse import foo
print(argparse)
def main():
pass
因此,我看到:
<module 'argparse' from '/usr/lib/python3.5/argparse.py'>
<module 'mypackage.argparse' from '/tmp/test/src/mypackage/argparse.py'>
为什么在这种情况下(而不是另一种情况),
from X import Y
语句会覆盖先前全局导入的argparse
到本地模块的导入?
__init__.py
在许多方面的工作原理。 :/ - Tadhg McDonald-Jensenargparse
,那么使用mypackage.argparse
会非常模糊不清,我建议将其导入为不同的名称(例如_std_argparse
)。 - Tadhg McDonald-Jensenmypackage.utils.argparse
这样的名称非常清晰明了。 - languitar