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

看板Python作者 (God of Computer Science)時間3年前 (2020/08/05 17:39), 編輯推噓11(11063)
留言74則, 7人參與, 3年前最新討論串1/1
汝題,小弟有個研究目前卡在一個小地方,就是小弟目前是希望每個 import 的 module 都能先經過某一些修改操作之後再執行 (import),但是小弟遍嘗試了網路上的各種宣稱 能模擬內建找尋 module 的方法之後都還是有些缺陷,所以想請問專業的各位, 我是想覆寫內建的 builtins.__import__ 方法,在執行之前先攔截系統幫我們找好的 module,我修改之後再執行,簡單來說不要讓這個 module 被執行兩遍,該如何做? 因為事關研究,如果嘗試了解答者的做法之後確實成功,我會給予至少 3000P 以上的 高額酬勞。穴穴大家! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.16.166 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1596620348.A.3BF.html

08/05 19:25, 3年前 , 1F
試試參考這篇下面回答的做法?據回答者所說,限定Python
08/05 19:25, 1F

08/05 19:25, 3年前 , 2F
3.5+。
08/05 19:25, 2F

08/05 19:25, 3年前 , 3F
08/05 19:25, 3F

08/05 19:27, 3年前 , 4F
不過我沒聽很懂你所謂不要執行兩次的意思,原本import機
08/05 19:27, 4F

08/05 19:27, 3年前 , 5F
制就有擋重複載入,如果上面方法不合你需求那可能問題要
08/05 19:27, 5F

08/05 19:27, 3年前 , 6F
更明確給個例子
08/05 19:27, 6F

08/05 19:32, 3年前 , 7F
你說找過某些方法都有缺陷,那也應該簡單講一下找到的方
08/05 19:32, 7F

08/05 19:32, 3年前 , 8F
法跟不合你用的地方在哪,不然到時大家一直回都是你找過
08/05 19:32, 8F

08/05 19:32, 3年前 , 9F
不合用的方法,豈不浪費彼此時間XD
08/05 19:32, 9F

08/05 21:12, 3年前 , 10F
這篇我當然是看過的了XD 就是因為裡面的做法在某些
08/05 21:12, 10F

08/05 21:12, 3年前 , 11F
媽九就是找不到,但內建的__import__卻又可以,我才
08/05 21:12, 11F

08/05 21:13, 3年前 , 12F
覺得很怪,之所以說不要兩次是因為我目前是直接先
08/05 21:13, 12F

08/05 21:13, 3年前 , 13F
執行內建import,修改之後再執行一次,總共兩遍,
08/05 21:13, 13F

08/05 21:13, 3年前 , 14F
但是某些沒有source的module因為不能修改就只執行一
08/05 21:13, 14F

08/05 21:14, 3年前 , 15F
次,這樣疑似造成某個媽九會有circular import問題
08/05 21:14, 15F

08/05 21:14, 3年前 , 16F
才想問問有沒有其他作法,就是找法要跟內建的import
08/05 21:14, 16F

08/05 21:14, 3年前 , 17F
一模一樣的才行,我知道這個問題很難XD
08/05 21:14, 17F

08/05 21:15, 3年前 , 18F
而且你想想看,理論上本來不就是應該要提供使用者和
08/05 21:15, 18F

08/05 21:15, 3年前 , 19F
內建找法一樣的function供使用才方便嗎?
08/05 21:15, 19F

08/05 21:16, 3年前 , 20F
堂堂我大Python竟然連這點小功能都提供不出來像話嗎
08/05 21:16, 20F

08/05 21:41, 3年前 , 21F
不知道這個理論上是什麼理論? 有其他程式語言有提供這樣的功
08/05 21:41, 21F

08/05 21:41, 3年前 , 22F
能嗎
08/05 21:41, 22F

08/05 21:57, 3年前 , 23F
要跟內建找法一樣的function 不是很懂 可以講詳細一點嗎
08/05 21:57, 23F

08/05 21:58, 3年前 , 24F
也說說你是哪個模組出問題 這樣研究起來比較快
08/05 21:58, 24F

08/06 09:52, 3年前 , 25F
沒這種理論吧,有些語言是直接根本沒有所謂的內建module啊
08/06 09:52, 25F

08/06 09:58, 3年前 , 26F
,或是許多不支持Implicit declaration of functions皆如
08/06 09:58, 26F

08/06 09:58, 3年前 , 27F
08/06 09:58, 27F

08/06 10:18, 3年前 , 28F
老實說,除了少數Python完全不用import就能call的東西以外
08/06 10:18, 28F

08/06 10:19, 3年前 , 29F
,其他不是大不了你就不要安裝,完全寫一個同名module就搞
08/06 10:19, 29F

08/06 10:19, 3年前 , 30F
定了嗎
08/06 10:19, 30F

08/06 10:20, 3年前 , 31F
我覺得你還是得直接給出一個實例,不然根本搞不懂真正的問
08/06 10:20, 31F

08/06 10:20, 3年前 , 32F
題在哪,弄半天大家都困在XY Problem裡面浪費時間
08/06 10:20, 32F

08/06 10:26, 3年前 , 33F
而且也看不出「找法要跟原本一模一樣」的意思或必要性
08/06 10:26, 33F

08/06 10:28, 3年前 , 34F
而一般會造成circular import的根本理由是程式架構出了問
08/06 10:28, 34F

08/06 10:29, 3年前 , 35F
題,在你的說明裡面也看不出為啥會需要發生交叉import XD
08/06 10:29, 35F

08/06 11:49, 3年前 , 36F
好吧,可能我的發問不夠清楚,但是重新敘述又會很花
08/06 11:49, 36F

08/06 11:49, 3年前 , 37F
時間,這個問題我先自己再看看官網,如果到時候能切
08/06 11:49, 37F

08/06 11:49, 3年前 , 38F
成更小塊的話我會再回文發問的
08/06 11:49, 38F

08/06 13:47, 3年前 , 39F
修改底層很抖耶 不打算用任何套件?
08/06 13:47, 39F

08/06 15:50, 3年前 , 40F
簡單來說,我就只是希望我找得到module<==>內建方法
08/06 15:50, 40F

08/06 15:50, 3年前 , 41F
也找得到那個module,這樣而已,官方文件有提供
08/06 15:50, 41F

08/06 15:51, 3年前 , 42F
importlib.util.find_spec(,)這個函式,不過他必須
08/06 15:51, 42F

08/06 15:51, 3年前 , 43F
要提供兩個參數,第二個是base path,我看內建的
08/06 15:51, 43F

08/06 15:51, 3年前 , 44F
__import__沒有這種參數,才覺得怪,不然用find_spe
08/06 15:51, 44F

08/06 15:52, 3年前 , 45F
c就好了
08/06 15:52, 45F

08/06 16:14, 3年前 , 46F
為什麼內建的__import__就不用提供find_spec的二參
08/06 16:14, 46F

08/06 16:16, 3年前 , 47F
我似乎快找到答案...
08/06 16:16, 47F

08/06 16:32, 3年前 , 48F
內建的本來就不需要參數啊?因為它會從current directory
08/06 16:32, 48F

08/06 16:33, 3年前 , 49F
、PYTHONPATH環境變數指定的目錄、Python安裝目錄去找
08/06 16:33, 49F

08/06 16:39, 3年前 , 50F
我現在想知道用內建的
08/06 16:39, 50F

08/06 16:39, 3年前 , 51F
__import__和我手動呼叫的find_spec回傳的結果差異
08/06 16:39, 51F

08/06 16:40, 3年前 , 52F
08/06 16:40, 52F

08/06 16:41, 3年前 , 53F
08/06 16:41, 53F

08/06 16:42, 3年前 , 54F
我現在不解的就是這個 Case 2,它用內建__import__
08/06 16:42, 54F

08/06 16:42, 3年前 , 55F
是只會回傳最高級的package,這個它官網上有寫,但
08/06 16:42, 55F

08/06 16:42, 3年前 , 56F
是Case1和Case2的name給法都是有包含.的,那為什麼
08/06 16:42, 56F

08/06 16:43, 3年前 , 57F
會有差異?這我真的就不懂,才造成無法靈活地用find
08/06 16:43, 57F

08/06 16:43, 3年前 , 58F
_spec去取代內建__import__
08/06 16:43, 58F

08/06 17:15, 3年前 , 59F
好像是跟 fromlist 是不是空的有關
08/06 17:15, 59F

08/06 17:17, 3年前 , 60F
如果我最後有試出來我要的解答的話會回饋給板上的
08/06 17:17, 60F

08/06 18:04, 3年前 , 61F
"Why does Python's __import__ require fromlist?"
08/06 18:04, 61F

08/06 18:17, 3年前 , 62F
__import__(name, globals=None, locals=None,
08/06 18:17, 62F

08/06 18:18, 3年前 , 63F
fromlist=(), level=0): blablabla 它給的標準格式
08/06 18:18, 63F

08/06 18:18, 3年前 , 64F
我的意思是你去google, stackoverflow 早就有人回答
08/06 18:18, 64F

08/06 18:30, 3年前 , 65F
喔喔,可是他那篇還是沒寫出怎麼用自己的實作取代掉
08/06 18:30, 65F

08/06 18:31, 3年前 , 66F
內建的__import__,我說finder的部分,loader我不管
08/06 18:31, 66F

08/06 18:45, 3年前 , 67F
扒 importlib 的 source code 看啊 ...
08/06 18:45, 67F

08/07 11:26, 3年前 , 68F
你都看得懂網路文章了, 直接寫英文去 discc.python.org
08/07 11:26, 68F

08/07 11:26, 3年前 , 69F
問會比較容易得到答案, 這邊問就算放酬勞也沒什麼用
08/07 11:26, 69F

08/07 21:34, 3年前 , 70F
其實我比較好奇你想做什麼修改
08/07 21:34, 70F

08/08 10:41, 3年前 , 71F
送!我找到答案ㄌ,大家不用再為我操心了唷
08/08 10:41, 71F

08/08 10:42, 3年前 , 72F

08/08 10:43, 3年前 , 73F
答案就在樓上這一篇跟它readme裡面所提到的文章囉!
08/08 10:43, 73F

08/11 15:45, 3年前 , 74F
文章代碼(AID): #1VAduyE_ (Python)
文章代碼(AID): #1VAduyE_ (Python)