为什么莳萝通过引用转储外部类,无论如何?

为什么莳萝通过引用转储外部类,无论如何?,第1张

为什么莳萝通过引用转储外部类,无论如何?

我是

dill
作者
foo.Foo
实例
ff
),因为它是在一个文件中定义的参考咸菜。这主要是为了使腌制后的琴弦紧凑。因此,当我通过引用导入类时,我想到的主要问题是,在您可能想解散的其他资源上找不到类定义(即
foo
那里不存在任何模块)。我认为这是当前的功能请求(如果不是,请随时在github页面上提交票证)。

但是请注意,如果您确实动态地修改了该类,则确实会将动态修改后的代码拉到腌制的字符串中。

>>> import dill>>> import foo>>> >>> class Foo:...     y = 1...     def bar( self, x ):...         return x + Foo.y... >>> f = Foo()>>> ff = foo.Foo()

因此,当

Foo
在被定义
__main__
byref
被尊重。

>>> dill.dumps(f, byref=False)   b'x80x03cdill.dilln_create_typenqx00(cdill.dilln_load_typenqx01Xx04x00x00x00typeqx02x85qx03Rqx04Xx03x00x00x00Fooqx05hx01Xx06x00x00x00objectqx06x85qx07Rqx08x85qt}qn(Xrx00x00x00__slotnames__qx0b]qx0cXx03x00x00x00barqrcdill.dilln_create_functionnqx0e(cdill.dilln_unmarshalnqx0fC]xe3x02x00x00x00x00x00x00x00x02x00x00x00x02x00x00x00Cx00x00x00sx0bx00x00x00|x01x00tx00x00jx01x00x17S)x01N)x02xdax03Fooxdax01y)x02xdax04selfxdax01xxa9x00rx05x00x00x00xfax07<stdin>xdax03barx03x00x00x00sx02x00x00x00x00x01qx10x85qx11Rqx12c__builtin__n__main__nhrNN}qx13tqx14Rqx15Xx07x00x00x00__doc__qx16NXnx00x00x00__module__qx17Xx08x00x00x00__main__qx18Xx01x00x00x00yqx19Kx01utqx1aRqx1b)x81qx1c.'>>> dill.dumps(f, byref=True)b'x80x03c__main__nFoonqx00)x81qx01.'>>>

但是,当在模块中定义类时,

byref
则不予考虑。

>>> dill.dumps(ff, byref=False)b'x80x03cfoonFoonqx00)x81qx01.'>>> dill.dumps(ff, byref=True)b'x80x03cfoonFoonqx00)x81qx01.'

请注意,

recurse
在这种情况下,我不会使用该选项,因为
Foo.y
可能会无限递归。我认为这也是目前的门票,但是如果没有,应该有。

让我们更深入地研究……如果我们修改实例该怎么办……

>>> ff.zap = lambda x: x + ff.y>>> _ff = dill.loads(dill.dumps(ff))>>> _ff.zap(2)3>>> dill.dumps(ff, byref=True)b'x80x03cfoonFoonqx00)x81qx01}qx02Xx03x00x00x00zapqx03cdill.dilln_create_functionnqx04(cdill.dilln_unmarshalnqx05CYxe3x01x00x00x00x00x00x00x00x01x00x00x00x02x00x00x00Cx00x00x00sx0bx00x00x00|x00x00tx00x00jx01x00x17S)x01N)x02xdax02ffxdax01y)x01xdax01xxa9x00rx04x00x00x00xfax07<stdin>xdax08<lambda>x01x00x00x00sx00x00x00x00qx06x85qx07Rqx08c__builtin__n__main__nXx08x00x00x00<lambda>qtNN}qntqx0bRqx0csb.'>>> dill.dumps(ff, byref=False)b'x80x03cfoonFoonqx00)x81qx01}qx02Xx03x00x00x00zapqx03cdill.dilln_create_functionnqx04(cdill.dilln_unmarshalnqx05CYxe3x01x00x00x00x00x00x00x00x01x00x00x00x02x00x00x00Cx00x00x00sx0bx00x00x00|x00x00tx00x00jx01x00x17S)x01N)x02xdax02ffxdax01y)x01xdax01xxa9x00rx04x00x00x00xfax07<stdin>xdax08<lambda>x01x00x00x00sx00x00x00x00qx06x85qx07Rqx08c__builtin__n__main__nXx08x00x00x00<lambda>qtNN}qntqx0bRqx0csb.'>>>

没关系,它引入了动态添加的代码。但是,我们可能想修改

Foo
实例而不是实例。

>>> Foo.zap = lambda self,x: x + Foo.y>>> dill.dumps(f, byref=True)b'x80x03c__main__nFoonqx00)x81qx01.'>>> dill.dumps(f, byref=False)b'x80x03cdill.dilln_create_typenqx00(cdill.dilln_load_typenqx01Xx04x00x00x00typeqx02x85qx03Rqx04Xx03x00x00x00Fooqx05hx01Xx06x00x00x00objectqx06x85qx07Rqx08x85qt}qn(Xx03x00x00x00barqx0bcdill.dilln_create_functionnqx0c(cdill.dilln_unmarshalnqrC]xe3x02x00x00x00x00x00x00x00x02x00x00x00x02x00x00x00Cx00x00x00sx0bx00x00x00|x01x00tx00x00jx01x00x17S)x01N)x02xdax03Fooxdax01y)x02xdax04selfxdax01xxa9x00rx05x00x00x00xfax07<stdin>xdax03barx03x00x00x00sx02x00x00x00x00x01qx0ex85qx0fRqx10c__builtin__n__main__nhx0bNN}qx11tqx12Rqx13Xx07x00x00x00__doc__qx14NXrx00x00x00__slotnames__qx15]qx16Xnx00x00x00__module__qx17Xx08x00x00x00__main__qx18Xx01x00x00x00yqx19Kx01Xx03x00x00x00zapqx1ahx0c(hrC`xe3x02x00x00x00x00x00x00x00x02x00x00x00x02x00x00x00Cx00x00x00sx0bx00x00x00|x01x00tx00x00jx01x00x17S)x01N)x02xdax03Fooxdax01y)x02xdax04selfxdax01xxa9x00rx05x00x00x00xfax07<stdin>xdax08<lambda>x01x00x00x00sx00x00x00x00qx1bx85qx1cRqx1dc__builtin__n__main__nXx08x00x00x00<lambda>qx1eNN}qx1ftq Rq!utq"Rq#)x81q$.'

好的,那很好,但是

Foo
在我们的外部模块中呢?

>>> ff = foo.Foo()>>> >>> foo.Foo.zap = lambda self,x: x + foo.Foo.y>>> dill.dumps(ff, byref=False)b'x80x03cfoonFoonqx00)x81qx01.'>>> dill.dumps(ff, byref=True)b'x80x03cfoonFoonqx00)x81qx01.'>>>

嗯…不好。因此,以上可能是一个非常引人注目的用例,它可以更改

dill
模块中定义的类的行为显示-或至少启用其中一项设置以提供更好的行为。

总而言之,答案是:我们没有用例,因此,既然有了用例,这应该是一个功能请求(如果尚未使用的话)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存