2017-10-20 78 views
4

給出一個簡單的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

回答

1

當您foo.bar引用它,它不引用到__init__.py文件中導入語句中使用bar,取而代之的則是bar模塊/文件本身的參考。即使您刪除__init__.py文件中的所有代碼,import foo; foo.bar仍然可以使用。

如果不是這樣,你就不會已經能夠做這樣的事

import foo.bar 

由於foo是一個包,因爲它包含__init__文件,因此它的內部文件可以被引用直。

相關問題