gpt4 book ai didi

python - 为什么 "import module"然后 "from package import module"再次加载模块?

转载 作者:太空狗 更新时间:2023-10-29 17:34:35 25 4
gpt4 key购买 nike

我的 PYTHONPATH 中有一个看起来像这样的包:

package/
__init__.py
module.py
print 'Loading module'

如果我从 package/ 目录运行 Python(或在此目录中编写另一个模块)并键入

import module

它加载 module.py 并按预期打印出“加载模块”。但是,如果我接着输入

from package import module

它加载 module.py 并打印“加载模块”再次,这是我不期望的。这样做的理由是什么?

注意:我想我从技术上理解为什么 Python 这样做,因为 import module 的 sys.modules 键只是 "module",但对于 来自 package import module 它是 “package.module”。所以我想我想知道的是为什么这里的 key 不同——为什么不将文件的路径名用作 key ,以便 Python 在这里执行预期的操作?

最佳答案

实际上,通过从 package 目录运行代码,您错误地配置了 Python。您不应该将该目录放在 sys.path 上,因为它在包内。

Python 不使用文件名作为键,因为它不是导入文件,而是导入模块。允许人们执行“import c:\jim\my files\projects\code\stuff”会助长各种肮脏行为。

请考虑这种情况:如果您在 ~/foo/package/ 中,而 ~/barPYTHONPATH 中会怎么样 - 但是 ~/bar 只是 ~/foo 的符号链接(symbolic link)?您是否希望 Python 解析,然后为您删除重复的符号链接(symbolic link)?如果将相对目录放在 PYTHONPATH 上,然后更改目录会怎样?如果“foo.py”是“bar.py”的符号链接(symbolic link)怎么办?您是否希望这两个都被删除重复数据?如果它们不是符号链接(symbolic link),而只是精确的副本怎么办?添加复杂的规则以尝试在模棱两可的情况下做一些方便的事情意味着它会做一些对其他人来说非常不方便的事情。 (Python zen 12:面对歧义,拒绝猜测的诱惑。)

Python 在这里做了一些简单的事情,您有责任确保环境设置正确。现在,您可能会争辩说,默认情况下将当前目录放在 PYTHONPATH 上并不是一个好主意——我什至可能同意你的看法——但鉴于它在那里,它应该遵循相同的一致集其他路径条目执行的规则。如果它打算从任意目录运行,您的应用程序始终可以从 sys.path 中删除当前目录,方法是从 sys.path.remove('') 开始.

关于python - 为什么 "import module"然后 "from package import module"再次加载模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282368/

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