python覆盖

ApeMan的Python项目详细描述


————————————————————截取一个"import"调用,用覆盖中提供的修补变量替换所需的模块。
overlay\[gentoo]uu只是一个python包,其中包含其他包的修补程序。
此外,overlays:file:`u init_upy`文件必须调用apeman.

覆盖使一个修补程序在多个项目中可用;一致地公开它们提供的附加api功能。
类似地,只需导入不同的覆盖,一组修补程序就可以快速地替换另一个修补程序。

当所讨论的类人猿对书有感情,不喜欢他们的读者,并劝阻,相当积极的人可以说,使用M…单词库管理员准则:脚注

…[gentoo]术语overlay取自portage gentoo linux的包管理器。
。[图书管理员]有人正要发现他们最可怕的噩梦是一个疯狂的图书管理员。带着徽章。假设…
…——
…<…一种是编写一个脚本,在python安装中从a:mod:`module`导入a:class:`class',
。:……
从模块导入类

打印(类())
…<…一个人非常希望这个类有某种特性,比如更好的字符串表示。其中一个实现了以下
…:……从模块导入类

类(类):
…定义str(self):
…返回"更好的{}表示法"。格式(str(self))
…<…在原始脚本中,他们现在将导入补丁
。:……
from.模块导入类
…<…打印(类())
…<…这证明是非常有用的,以至于人们希望将其修补后的实现:class:`class`提供给他们的所有项目。
…Apeman允许一个人将他们的补丁打包成一个覆盖层,这样
…:……
导入覆盖
…从模块导入类

print(class())

----
问题
----


有时需要修补其他包提供的函数和/或类;当它缺少特性或规范化提供的api时。
依赖于以下结构的简单实现;


project/一个项目的根文件夹project
package/一个包的根文件夹。
patch.py包含一个补丁的模块。
…#包中的其他模块。
u main_uuuu.py;导入并使用修补模块的主脚本。


将通过导入并重载"函数"和"类"模块来修补"源"模块中的功能。



_=函数
def函数(*args,**kvps):

拉入修改。



from.patch import*



这对于独立项目中的一次性修补程序非常有效。

其中一个可能会将修补程序复制到另一个项目,创建副本;随着功能的添加,这些副本会随着时间的推移而彼此分离。

创建更多的文件并加剧问题。
最终会出现多个le`patch`文件,分布在各个项目中,它们的内容彼此之间的差异越来越大。

——
——
——
——
——

apeman提供了一种希望更好的策略,可以始终如一地管理这些补丁。
将一个修补程序修补到覆盖中;一个专用于一个修补程序的包。
这可以在本地、子包内一次性使用;也可以在全局范围内、在单独的包内由多个包重复使用。

。如果以下表示一个包结构
………
.package/一个包的根文件夹。
….overlay/包含修补程序的覆盖。
….source目标包正在包装或修补。
….初始化py脚本导入apeman。
.py包主脚本,作为模块调用时执行。

…packages主文件通常会调用导入"source"模块,但通过导入覆盖图,apeman会首先重定向以后的导入,转而使用已修补的模块。
。:……
导入覆盖
…从源导入*



overlay structure
==在源模块或包之后重命名…#由调用apeman的overlay文件提供的进一步修补程序;将其标识为overlay:file:``uu init`.py`文件,然后从apeman import apeman导入并注册:类:`apeman`实例;





apeman=apeman()

用一个补丁替换原来的模块。


local overlay
=投影一个包的根文件夹。#覆盖的内容
…#包中的其他模块。
主脚本导入和使用修补模块。

覆盖
在全球范围内,一个覆盖是作为一个独立的包提供的。



project/>一个项目的根文件夹
覆盖/>apeman覆盖的根文件夹
…#覆盖的内容
package/一个包的根文件夹。
…#包中的其他模块。
主脚本导入和使用修补模块。



…必须显式地导入所需的功能,因为"overlayimporter"实际上会阻止进一步的导入。注意,一个覆盖包应该与它的同级模块一起驻留,以提供最大的灵活性。<…是否可以在包中的每个级别执行此操作取决于python如何强制作用域。

----
示例
----


>考虑从:mod:`decimal`模块修补:类:`decimal`类。


monkey patching
=下面的结构最容易实现。



package/根一个包的文件夹。
decimal.py;包含一个到decimal模块的补丁的模块。
decimal.py;包的主脚本,作为模块调用时执行。

在:file:` decimal.py`中导入:mod:`decimal`模块中的所有内容,然后导入子类和monkey修补"decimal"类;修改它的字符串表示形式。



如下所示::

导入。_decimal_u as decimal
从decimal导入decimal将"decimal.py"文件移动到名为"overlay"的子文件夹中,并使用生成的结构;
::

package/一个包的根文件夹。
overlay/包含修补程序的覆盖。
u decimal\py包含一个修补程序的模块到decimal模块。
u init.py u init\uu.py脚本导入apeman。打包主脚本,在作为模块调用时执行。

相应地,文件:``uu init\.py`文件应包含::


from apeman import apeman
apeman=apeman


然后对主文件进行调整以反映以下内容。


from decimal导入decimal

打印(decimal(42))

如下所示:


package/一个包的根文件夹。
decimal.py包含一个到decimal模块的补丁的模块。
uu main packages主脚本,在作为模块调用时执行。

,但这会导致一系列冲突和以下错误



attribute error:"module"对象没有属性"decimal"

。其他相关错误包括:
…系统错误:父模块""未加载,无法执行相对导入

…基本上:file:`decimal.py'模块安装在十进制名称空间内,防止导入原始库。


基本上:file:`package/decimal.py'文件加载为:mod:`decimal'模块,并在:attr:`sys.modules'下分配,保留"decimal"`键;防止随后导入实际的:mod:`decimal`模块。

…注意:

但只有我在创建包之后才发现这一点。

----
兼容性
----


该apeman旨在支持最少的一组功能,即显式和隐式覆盖提供结构与其预期源包匹配的修补程序。
除了这些基本功能之外提供的任何功能都被视为糖类,例如重复导入、堆叠覆盖,重构面片和子结构面片;

…测试者:mod:`*explict`:mod:`*implict`和:mod:`*init`测试(参见:ref:`testing`)。

…表::python导入系统在不同python实现中支持的一组功能
:align:center
:widths:auto

===========================================================================================
显式包x x x x
隐式包x x x
延迟加载x
c实现action x x
python实现x x
================================


apeman只在python 2.7中开发和测试过,3.4和3.6.
在切换到3.6之前,python 3.4实现最后一次测试是在作者仍然安装它的时候。
作者还维护了python 3.5的不稳定版本,但这不是一个好的测试环境,因此3.5中的apeman是不稳定的。
一般来说,如果您在python 2.7或3.6之外的任何其他版本中使用apeman,您都是自己的。

table::不同python实现支持的apeman特性集
:align:center
:宽度:4,1,1,1

======================================
python 2.7 3.4 3.5 3.6
===========================
显式包x x x?x
隐含包不适用x?x
重复导入????x
子结构覆盖
重新构造覆盖
堆叠覆盖
成功有两条规则……
。1)永远不要泄露您所知道的一切

-命令行选项
-b路径命令行选项



版本和,除非有人大错特错,否则实现应该仍然有效。
Python3.5包含了一些被Python3.4遗忘的遗留问题。
3.4实现应该在3.5中工作,但是当前的3.5实现与3.4的实现不同,在作者的机器上似乎是坏的。
python 3.6实现目前是最受测试和最稳定的,而python3.7还没有尝试过。


————
活到老!

BR/>这主要是由Portage,PanoGUI Linux的包管理器和David Beasley的教程启发的。
但是,只有通过Brett Cannon的贡献,才有可能将Python导入机器从C/C++移植到Python。

总的来说,我们也非常感谢python的开发人员和所有其他附带的第三方包。

…提示:标题
…:libs:calc

\画(0,0)圆(3em)圆(4em)圆(5em);

----
许可
----


此软件是在GPLv3许可下获得许可的。
有人请求任何主持此代码分支的人相应地通知作者,以便所做的任何有用修改都可以定期合并到代码库中。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
正则表达式使用Java从服务器截断文本   micronaut微服务的java内存消耗   如果私有函数需要相同的输入,java应该在公共函数中显式执行异常检查   为什么我们在java中使用抽象类和抽象方法   Java中接受外来字母的字符串?   cordova Android:ClassNotFoundException,包括ZXing   通过LiveData observer向特定索引添加项时出现java IndexOutOfBoundsException   jsp Java从两个源调用一个servlet   java如何设置网格布局中按钮的位置?   java HashMap返回方法   java JDK错误版本   java如何将现有类集成到新的Swing项目中   java如何在扫描程序位于输入端时使for循环停止   java正则表达式匹配空白表   java组织。格拉德尔。工具。BuildException:设置的代码长度无效   JList中的swing Java格式化字符串   javabeans如何将JavaBean属性映射到另一个名称以进行输出?   ajax请求后的java Rerender RichFaces错误消息