gpt4 book ai didi

python - 为什么从模块中导入符号也会定义模块符号?

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:28 24 4
gpt4 key购买 nike

给定一个带有 __init__.py 的普通 Python 包:

$ ls -R foo/
foo/:
__init__.py bar.py

$ cat foo/bar.py
def do_stuff(): pass

$ cat foo/__init__.py
from .bar import *

我很惊讶 foo.bar 被定义了:

>>> import foo
>>> foo.bar
<module 'foo.bar' from 'foo/bar.pyc'>

我对 from x import * 的理解是它没有在当前范围内定义 x。例如:

>>> from abc import *
>>> abc
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'abc' is not defined

为什么在我的第一个示例中定义了 foo.bar,即使我在 __init__.py 中没有 import bar

最佳答案

当您通过 foo.bar 引用它时,它不是引用 __init__.py 文件中导入语句中使用的 bar,相反,它是对 bar 模块/文件本身的引用。即使您删除了 __init__.py 文件中的所有代码,import foo; foo.bar 仍然有效。

如果不是这样,你就不会做这样的事情

import foo.bar

由于foo是一个包,因为它包含__init__文件,所以可以直接引用它的内部文件。

关于python - 为什么从模块中导入符号也会定义模块符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852659/

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