为什么从模块导入符号也会定义模块符号?
问题描述:
给出一个简单的Python包与__init__.py
:为什么从模块导入符号也会定义模块符号?
$ 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
,即使我没有import bar
里面__init__.py
?
答
当您foo.bar
引用它,它不引用到__init__.py
文件中导入语句中使用bar
,取而代之的则是bar
模块/文件本身的参考。即使您删除__init__.py
文件中的所有代码,import foo; foo.bar
仍然可以使用。
如果不是这样,你就不会已经能够做这样的事
import foo.bar
由于foo
是一个包,因为它包含__init__
文件,因此它的内部文件可以被引用直。