我是
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模块中定义的类的行为显示-或至少启用其中一项设置以提供更好的行为。
总而言之,答案是:我们没有用例,因此,既然有了用例,这应该是一个功能请求(如果尚未使用的话)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)