(Python)Monkeypatch\uuuuuu new\uuuuuuuuuu用于Python中int、float、str、list、dict、set和module类型的对象

2024-04-18 04:26:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用定制的替换(扩展)隐式扩展int、float、str、list、dict、set和module类。

当我说“隐式”时,我的意思是当我声明“a=1”时,会生成Custom\ Int类型的对象(作为示例),而不是普通的整数对象。你知道吗

现在,我理解并尊重不这样做的理由。首先-搞乱内置就像搞乱物理定律一样。它不会带来任何好处。也就是说-我明白我所做的事情的严重性,如果我做错了会发生什么。你知道吗

第二,我知道修改基本情况不仅会影响当前的运行时,还会影响所有正在运行的python进程。我觉得通过重写这些基类的uuu new_uuu方法,使得它返回自定义的u Object,无论当且仅当某些环境因素为真时,其他运行时基本上不会受到影响。你知道吗

那么,回到手头的问题-我如何重写这些不同类型的新方法?你知道吗

Python禁止水果包装似乎是有希望的。不过,我还没有机会对它进行仔细的调查,如果有人能理解它,并总结出它的作用,那将节省我很多时间。你知道吗

除此之外,我还观察到一些奇怪的现象。你知道吗

对于monkeypatching的每一个答案,如果最终没有回到forbiddenfruit或者forbiddenfruit是如何工作的,都与修改我将称之为类的“绝对字典”有关。因为Python中的所有内容本质上都是函数/值到名称的映射(或字典),如果在正确的映射中更改名称new,则会更改对象的性质。你知道吗

问题是-我几乎取得的每一次成功都表明,如果我调用str('a').\uu new\uuuuuuuz(*args)'),它工作得很好{在某些情况下},但是调用varOne='a'似乎实际上并没有调用str.\uu new\uuuuz()。你知道吗

我猜,这与python在启动前解析程序有关,或者与在启动期间/启动后缓存各种类有关。或者我完全偏离了目标。python在启动之前预先读取并应用一些regex到它的模块中,或者机器代码,当它试图隐式地创建一个对象时,它会到达位于模块对象.内置[\uu类名\uuuu]

有什么想法吗?你知道吗


Tags: 模块对象方法名称类型new字典情况
1条回答
网友
1楼 · 发布于 2024-04-18 04:26:54

如果您想这样做,最好的选择可能是修改CPython源代码,并使用实际内置类型中的扩展构建自己的自定义Python构建。结果将更好地集成所有您还不了解的低级机制,并且您将在这个过程中学到很多。你知道吗


现在,你被很多因素阻碍了。这些是我想到的。你知道吗

首先,大多数创建内置对象的方法根本不经过__new__方法。它们通过C级调用,比如^{}^{}。这些调用通过硬连线来使用实际的内置类型,为真正的内置类型分配内存大小,通过静态分配的C结构的地址获取类型对象,诸如此类。如果不构建自己的定制Python,基本上不可能改变这些。你知道吗

第二个因素是,与__new__打交道甚至不足以正确地影响理论上应该经历__new__的事情,比如int("5")。Python有理由阻止您在内置类上设置属性,其中两个原因是插槽类型属性缓存。你知道吗

Slots是C API的公共部分,如果您尝试修改CPython源代码,您可能会了解到它。它们是C结构中的函数指针,在C级构成类型对象,其中大多数对应于Python级的魔术方法。例如,__new__方法有一个对应的tp_new槽。大多数C代码访问插槽而不是方法,并且有一些代码可以确保插槽和方法是同步的,但是如果您绕过Python的保护,那么就会中断,一切都会变得一团糟。你知道吗

type attribute cache甚至在C级也不是任何东西的公共部分。它是一个缓存,用于保存类型对象属性查找的结果,以使Python运行得更快。它的内存安全依赖于经过type.__setattr__的所有类型对象属性修改(以及所有内置类型对象属性修改被type.__setattr__拒绝),但是如果您绕过保护,内存安全就会消失,并可能出现任意奇怪的结果。你知道吗

第三个因素是有一堆不可变对象的缓存。小的int缓存,内部字符串dict,常量保存在字节码对象中,编译时常量折叠。。。有很多。对象不会在您期望的时候创建。(还有一些东西,比如说,zip保存最后一个输出元组,如果它看到您没有保留引用,就重用它,因为更多的方法是对象创建会打乱您的假设。)

还有更多。比如,如果你试图用int.__new__来计算表达式5,你会用什么参数?像所有底层代码这样的东西,它们确切地知道如何处理它所期望的类型,如果它得到一个MyCustomTuple与实际元组具有完全不同的内存布局,就会非常混乱。使用内置软件有很多问题。你知道吗

顺便说一句,你期望成为问题的一件事基本上不是问题。使用一个Python进程的内置不会影响其他Python进程的内置。。。除非那些其他进程是通过分叉第一个进程创建的,比如分叉模式下的multiprocessing。你知道吗

相关问题 更多 >