[問題] 如何重現內建從 name 到 module 找尋機制

作者: alan23273850   2020-08-05 17:39:05
汝題,小弟有個研究目前卡在一個小地方,就是小弟目前是希望每個 import 的 module
都能先經過某一些修改操作之後再執行 (import),但是小弟遍嘗試了網路上的各種宣稱
能模擬內建找尋 module 的方法之後都還是有些缺陷,所以想請問專業的各位,
我是想覆寫內建的 builtins.__import__ 方法,在執行之前先攔截系統幫我們找好的
module,我修改之後再執行,簡單來說不要讓這個 module 被執行兩遍,該如何做?
因為事關研究,如果嘗試了解答者的做法之後確實成功,我會給予至少 3000P 以上的
高額酬勞。穴穴大家!
作者: ddavid (謊言接線生)   2020-08-05 19:25:00
試試參考這篇下面回答的做法?據回答者所說,限定Python3.5+。https://bit.ly/33uEGv6不過我沒聽很懂你所謂不要執行兩次的意思,原本import機制就有擋重複載入,如果上面方法不合你需求那可能問題要更明確給個例子你說找過某些方法都有缺陷,那也應該簡單講一下找到的方法跟不合你用的地方在哪,不然到時大家一直回都是你找過不合用的方法,豈不浪費彼此時間XD
作者: alan23273850   2020-08-05 21:12:00
這篇我當然是看過的了XD 就是因為裡面的做法在某些媽九就是找不到,但內建的__import__卻又可以,我才覺得很怪,之所以說不要兩次是因為我目前是直接先執行內建import,修改之後再執行一次,總共兩遍,但是某些沒有source的module因為不能修改就只執行一次,這樣疑似造成某個媽九會有circular import問題才想問問有沒有其他作法,就是找法要跟內建的import一模一樣的才行,我知道這個問題很難XD而且你想想看,理論上本來不就是應該要提供使用者和內建找法一樣的function供使用才方便嗎?堂堂我大Python竟然連這點小功能都提供不出來像話嗎
作者: TuCH (謬客)   2020-08-05 21:41:00
不知道這個理論上是什麼理論? 有其他程式語言有提供這樣的功能嗎要跟內建找法一樣的function 不是很懂 可以講詳細一點嗎也說說你是哪個模組出問題 這樣研究起來比較快
作者: ddavid (謊言接線生)   2020-08-06 09:52:00
沒這種理論吧,有些語言是直接根本沒有所謂的內建module啊,或是許多不支持Implicit declaration of functions皆如此老實說,除了少數Python完全不用import就能call的東西以外,其他不是大不了你就不要安裝,完全寫一個同名module就搞定了嗎我覺得你還是得直接給出一個實例,不然根本搞不懂真正的問題在哪,弄半天大家都困在XY Problem裡面浪費時間而且也看不出「找法要跟原本一模一樣」的意思或必要性而一般會造成circular import的根本理由是程式架構出了問題,在你的說明裡面也看不出為啥會需要發生交叉import XD
作者: alan23273850   2020-08-06 11:49:00
好吧,可能我的發問不夠清楚,但是重新敘述又會很花時間,這個問題我先自己再看看官網,如果到時候能切成更小塊的話我會再回文發問的
作者: TuCH (謬客)   2020-08-06 13:47:00
修改底層很抖耶 不打算用任何套件?
作者: alan23273850   2020-08-06 15:50:00
簡單來說,我就只是希望我找得到module<==>內建方法也找得到那個module,這樣而已,官方文件有提供importlib.util.find_spec(,)這個函式,不過他必須要提供兩個參數,第二個是base path,我看內建的__import__沒有這種參數,才覺得怪,不然用find_spec就好了為什麼內建的__import__就不用提供find_spec的二參我似乎快找到答案...
作者: ddavid (謊言接線生)   2020-08-06 16:32:00
內建的本來就不需要參數啊?因為它會從current directory、PYTHONPATH環境變數指定的目錄、Python安裝目錄去找
作者: alan23273850   2020-08-06 16:39:00
" target="_blank" rel="nofollow">
我現在想知道用內建的__import__和我手動呼叫的find_spec回傳的結果差異Case1 相同:" target="_blank" rel="nofollow">
Case2 相異:" target="_blank" rel="nofollow">
我現在不解的就是這個 Case 2,它用內建__import__是只會回傳最高級的package,這個它官網上有寫,但是Case1和Case2的name給法都是有包含.的,那為什麼會有差異?這我真的就不懂,才造成無法靈活地用find_spec去取代內建__import__好像是跟 fromlist 是不是空的有關如果我最後有試出來我要的解答的話會回饋給板上的
作者: AndCycle (AndCycle)   2020-08-06 18:04:00
"Why does Python's __import__ require fromlist?"
作者: alan23273850   2020-08-06 18:17:00
__import__(name, globals=None, locals=None,fromlist=(), level=0): blablabla 它給的標準格式
作者: AndCycle (AndCycle)   2020-08-06 18:18:00
我的意思是你去google, stackoverflow 早就有人回答
作者: alan23273850   2020-08-06 18:30:00
喔喔,可是他那篇還是沒寫出怎麼用自己的實作取代掉內建的__import__,我說finder的部分,loader我不管
作者: AndCycle (AndCycle)   2020-08-06 18:45:00
扒 importlib 的 source code 看啊 ...
作者: uranusjr (←這人是超級笨蛋)   2020-08-07 11:26:00
你都看得懂網路文章了, 直接寫英文去 discc.python.org問會比較容易得到答案, 這邊問就算放酬勞也沒什麼用
作者: s860134 (s860134)   2020-08-07 21:34:00
其實我比較好奇你想做什麼修改
作者: alan23273850   2020-08-08 10:41:00
送!我找到答案ㄌ,大家不用再為我操心了唷https://github.com/abarnert/floatliteralhack答案就在樓上這一篇跟它readme裡面所提到的文章囉!
作者: Yshuan (倚絃)   2020-08-11 15:45:00

Links booklink

Contact Us: admin [ a t ] ucptt.com