[问题] 如何重现内建从 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
https://imgur.com/zrQXpPl 我现在想知道用内建的__import__和我手动呼叫的find_spec回传的结果差异Case1 相同:https://imgur.com/Lf7p57cCase2 相异:https://imgur.com/2WUmgFI我现在不解的就是这个 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