使用黑暗魔法来统一代表。
repromanc的Python项目详细描述
:法师:恢复:僵尸:
repmancy利用黑暗魔法来做出更好的表现,尤其是在 {/str}动态创建
什么?在
在某些情况下,Python可以给出难看的repr。例如,如果我们有一个 包spam,其子模块ham定义了ham类。这个 代表是:
<class'spam.ham.Ham'>
一切都很好,但是假设我们实际上直接在Ham中导入Ham 包,以便它可以作为^{em1}访问$垃圾邮件。火腿。事实上,这是 我们向用户宣传界面,但是当他们在他们的Hams上做报告时 得到这个额外的ham模块,他们根本不在乎!我们会怎么做 喜欢看的是:
^{pr2}$因为这就是我们定义公共API的方式,所以底层模块不是 非常相关。在
repomance修复了此问题以及其他问题。以一个价格。。。
怎么做的?在
谴责.铸造用于执行修复 代表。对于模块,只需将以下内容添加到bottom 你的模块:
if__debug__:importrepromancyrepromancy.cast(repromancy.CallingModule)delrepromancy
这将对当前模块命名空间中的所有内容执行重新执行。 请注意,cast是递归的,它将遵循它所能执行的所有操作,但只能 在cast所在的包中修改内容。在
谴责.铸造可用于大多数python对象(而不是内置对象)。在
动态类和函数
假设我们有一个^{str1}$函数,名为factory,它返回一个新的 创建了class(或者它可能是另一个函数,但是我们将使用 class在本例中):
>>>deffactory():...classClass:...pass...returnClass...>>>factory()<class'__main__.factory.<locals>.Class'>
默认的repr并不是非常有用,尤其是因为所有的*classes 除非明确定义,否则工厂生成的repr将具有相同的repr 工厂功能本身。假设在我们的模块中我们称之为 工厂化多次并给出结果的本地名称,然后 cast repomance在模块上:
>>>ClassA=factory()>>>ClassB=factory()>>>importrepromancy>>>repromancy.cast(repromancy.CallingModule)>>>ClassA<class'__main__.ClassA'>>>>ClassB<class'__main__.ClassB'>
repmancy使代表更加清晰。在
:山羊:黑暗魔法?:生物危害:
repomance顾名思义,使用一些有问题的方法来 得到它的结果。特别是,it monkey修补了一些cpython内置程序 类型,改变它们的方法。这是一个global更改为 影响所有模块和子解释器的python解释器。像这样的, 建议仅在定义了“调试”时执行重新执行。在
具体变化如下:
- 如果 完全限定名以“<;”开头(另一个repr)
- 函数包括在其repr中定义它们的模块,这是 与object和typereprs一致
- 方法显示其函数的repr,而不仅仅是名称
- 项目
标签: