gpt4 book ai didi

python: from x import y 改变之前的导入结果

转载 作者:行者123 更新时间:2023-11-28 18:31:01 25 4
gpt4 key购买 nike

我试图理解 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 全局导入到本地模块?

最佳答案

考虑如何访问子模块,您将编写 mypackage.argparse 来访问 mypackage 的子模块。

现在考虑模块的属性查找是如何工作的,它在模块全局命名空间中搜索属性。

将这两者放在一起,访问子模块的唯一方法是将它们添加到包全局命名空间,这是预期的行为。

关于python: from x import y 改变之前的导入结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37317153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com