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

问题描述:

给出一个简单的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__文件,因此它的内部文件可以被引用直。