囉唆一下:寫完第30天的文章後才回來繼續補,所以這才是真正的最後一天文章呵呵~
前天與昨天介紹了sys.path初始化的機制以及pth是如何把路徑加進sys.path的,這可能讓許多人產生一種錯覺,好像import一個模組就只是把sys.path裏面的所有路徑都搜尋一遍,然後把符合模組名的py檔load進來而已。
這你就錯了!python的import機制可以藉著客製化而變的更有彈性,符合更多的需求,甚至你在import的過程中亂來都行XD,而所謂更多的需求可能像是你可以import遠端的模組、引入一個非py檔的文件或是對於對於被引入的模組做一些額外的檢查,我們就先從import指令運行的流程來做切入吧。
我試著比對一下(其實比對非常久)https://github.com/Liuchang0812/slides/tree/master/pycon2015cn以及官方文檔https://docs.python.org/3/reference/import.html的內容,我覺得當python在import一個模組時,他會先:
In python3 shell:
>>> import sys
>>> sys.meta_path
[<class '_frozen_importlib.BuiltinImporter'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib.PathFinder'>]
>>>
若我們想要做一個客製化的import機制,就必須自己建構一個import hook,主要有兩個方法,第一個是做一個Finder插入到sys.meta_path,這通常被稱做meta hook,另外一個就是去依靠PathFinder,做一個函式插入到sys.path_hooks裏面,但這個方法要確保你想要處理的路徑有在sys.path裏面,而這通常被稱做path hook。
如果明天還有時間的話我就補補看阿,但是真的好難阿嗚嗚...還是就這樣好了XD,這真得太難了我果然還是hold不來,ya現在放棄我就完賽了~。
如果還有人還想繼續深究的話可以參考以下網址:
http://python3-cookbook.readthedocs.io/zh_CN/latest/c10/p11_load_modules_from_remote_machine_by_hooks.html