根據(jù)例子逐個(gè)分析
頂層平行導(dǎo)入
- 見(jiàn)上一篇
- 見(jiàn)上一篇
- 見(jiàn)上一篇
- 見(jiàn)上一篇
- 在上面的基礎(chǔ)上,我們?cè)黾诱{(diào)用
test()
函數(shù)的語(yǔ)句岸浑。從上面dir()
的結(jié)果看,如果按照import
導(dǎo)入時(shí)采用top.test()
方式調(diào)用矢洲,應(yīng)該會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有看到載入top
读虏。
實(shí)際運(yùn)行結(jié)果责静,拋出找不到top
的異常:
============== top.py ==============
Traceback (most recent call last):
File "E:\WorkSpace\Python\test\sound\test_main.py", line 5, in <module>
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
top.test()
NameError: name 'top' is not defined
[Finished in 0.2s with exit code 1]
采取直接調(diào)用test()
的方式,運(yùn)行正常盖桥。
代碼:
# 導(dǎo)入top
from top import test
test()
# test_mian.py原始內(nèi)容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# main()
if __name__ == '__main__':
test()
運(yùn)行結(jié)果:
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== top.test ==============
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test']
============== test_main.test ==============
[Finished in 0.2s]
-
名字空間問(wèn)題灾螃。
上面的例子中,由test()
替代了之前的top.test()
揩徊。這會(huì)帶來(lái)一個(gè)名字上的沖突腰鬼,因?yàn)椴粌Htop.py
有test()
函數(shù),test_main.py
本身也有一個(gè)test()
函數(shù)塑荒。
6.1 從上面例子的運(yùn)行結(jié)果看熄赡,在from top import test
后的test()
是調(diào)用的top.test()
, 在if __name__ == '__main__':
后面調(diào)用的test()
是test_main.test()
齿税。
6.2 我們?cè)傩薷囊幌律厦娴拇a彼硫,將from top import test
后的test()
,放在def test()
的函數(shù)里面拧篮。
代碼如下:
# 導(dǎo)入top
from top import test
# test_mian.py原始內(nèi)容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
test()
# main()
if __name__ == '__main__':
test()
運(yùn)行的結(jié)果是,挪動(dòng)后test()
被認(rèn)為是調(diào)用test_main.test()
缺虐,也就是說(shuō)自己在遞歸調(diào)用自己赏参。所以志笼,打印的結(jié)果是無(wú)限循環(huán)把篓,最后資源不夠拋出異常腰涧。
運(yùn)行結(jié)果(太長(zhǎng),省略中間內(nèi)容)
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test']
============== test_main.test ==============
============== test_main.test ==============
============== test_main.test ==============
============== test_main.test ==============
============== test_main.test ==============
中間重復(fù)打印
File "E:\WorkSpace\Python\test\sound\test_main.py", line 10, in test
test()
File "E:\WorkSpace\Python\test\sound\test_main.py", line 10, in test
test()
RuntimeError: maximum recursion depth exceeded
6.3 我們?cè)侔?code>test()挪一下窖铡,挪出def test():
函數(shù)體外,放在其下一行滑臊。
代碼如下:
# 導(dǎo)入top
from top import test
# test_mian.py原始內(nèi)容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
test()
# main()
if __name__ == '__main__':
test()
運(yùn)行結(jié)果其實(shí)跟6.2
一樣箍铲,test()
被認(rèn)為是test_main.test()
雇卷。只是由于不是遞歸調(diào)用颠猴,所以就打印了一行而已。下面是運(yùn)行結(jié)果:
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test']
============== test_main.test ==============
============== test_main.test ==============
6.4 再次對(duì)代碼進(jìn)行改動(dòng)翘瓮,我們?cè)?code>6.3的基礎(chǔ)上,將from top import test
挪到def test()
函數(shù)和test()
之間调榄。代碼如下:
# test_mian.py原始內(nèi)容
print "============== test_main.py =============="
print dir()
def test():
print "============== test_main.test =============="
# 導(dǎo)入top
from top import test
test()
# main()
if __name__ == '__main__':
test()
運(yùn)行結(jié)果發(fā)現(xiàn)呵扛,test()
和__main_中的test()
都被認(rèn)為是top.test()
振峻,而不再是test_main.test()
择份。實(shí)際結(jié)果如下:
============== test_main.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== top.py ==============
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
============== top.test ==============
============== top.test ==============
從實(shí)例情況來(lái)看,import
和def
都會(huì)覆蓋原有的相同函數(shù)名凤价。具體調(diào)用的是哪個(gè)鸽斟,就看調(diào)用時(shí)哪個(gè)是最后一個(gè)被導(dǎo)入或者定義的利诺。
頂層平行導(dǎo)入小結(jié):
- 對(duì)于最頂層的同級(jí)文件互相導(dǎo)入時(shí),
import m
和from m import f
均有效慢逾。只是import m
調(diào)用方式是m.f
,而from m import f
調(diào)用方式是f
口注。 - Python執(zhí)行
import m
或from m import f
時(shí)君珠,會(huì)將py文件編譯成pyc寝志,并且會(huì)執(zhí)行全局的那些代碼策添。 - 采取
from m import f
方式導(dǎo)入,可能會(huì)涉及到名字空間沖突問(wèn)題唯竹。調(diào)用f
時(shí),具體的調(diào)用對(duì)象浸颓,需要查看其往上最近的import
或def
對(duì)象確定。