python – 为什么从模块导入符号也定义模块符号?

给出一个带有__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'>

我对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中没有导入栏?

最佳答案 当您通过foo.bar引用它时,它不会引用__init__.py文件中import语句中使用的bar,而是引用bar模块/文件本身.即使你删除了__init__.py文件中的所有代码,也要导入foo; foo.bar仍然可以工作.

如果不是这样,你将无法做到这样的事情

import foo.bar

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

点赞