编程语言
首页 > 编程语言> > 如何针对自定义类型调试调用Python的copy.deepcopy()的问题?

如何针对自定义类型调试调用Python的copy.deepcopy()的问题?

作者:互联网

在我的代码中,我试图使用copy.deepcopy来获取类的实例副本.问题是在某些情况下出现以下错误是错误的:

TypeError: 'object.__new__(NotImplementedType) is not safe, use NotImplementedType.__new__()'

经过大量挖掘后,我发现我能够使用以下代码重现错误:

import copy
copy.deepcopy(__builtins__) 

问题似乎是在某些时候它试图复制NotImplementedType内置.问题是为什么这样做?我没有在课堂上覆盖__deepcopy__而且它不会一直发生.有没有人有任何关于追踪制作此类副本的请求来自哪里的提示?

我已经在复制模块本身中放置了一些调试代码以确保这就是正在发生的事情,但问题发生的地方到目前为止在递归堆栈中很难做出我所看到的大部分内容.

解决方法:

最后,我在复制源代码中进行了一些挖掘,并提出了以下解决方案:

from copy import deepcopy, _deepcopy_dispatch
from types import ModuleType

class MyType(object):

    def __init__(self):
        self.module = __builtins__

    def copy(self):
        ''' Patch the deepcopy dispatcher to pass modules back unchanged '''
        _deepcopy_dispatch[ModuleType] = lambda x, m: x
        result = deepcopy(self)
        del _deepcopy_dispatch[ModuleType]
        return result

MyType().copy()

我意识到这使用私有API,但我找不到另一种实现同样的方法.我在网上做了一个quick search,发现其他人没有任何麻烦使用相同的API.如果它将来发生变化,我会受到打击.

我也知道这不是线程安全的(如果一个线程需要旧的行为,而我在另一个线程上做副本我会被搞砸)但是现在再次对我来说不是问题.

希望在某些时候帮助别人.

标签:python,deep-copy
来源: https://codeday.me/bug/20190622/1259469.html