gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:50:36 25 4
gpt4 key购买 nike

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

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

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

import copy
copy.deepcopy(__builtins__)

问题似乎是在某些时候它试图复制 NotImplementedType 内置函数。问题是它为什么要这样做?我没有在类里面覆盖 __deepcopy__ 并且它不会一直发生。有没有人有任何提示来追踪制作此类副本的请求来自何处?

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

最佳答案

最后我在copy 源代码中做了一些挖掘并提出了以下解决方案:

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()

我知道这使用私有(private) API,但我找不到另一种干净的方法来实现同样的事情。我做了一个quick search在网络上,发现其他人已经毫不费力地使用了相同的 API。如果它在未来发生变化,我会接受打击。

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

希望在某些时候能帮助其他人。

关于python - 如何调试针对自定义类型调用 Python 的 copy.deepcopy() 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1941887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com