如何针对自定义类型调试调用Python的copy.deepcopy()的问题?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何针对自定义类型调试调用Python的copy.deepcopy()的问题?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1301字,纯文字阅读大概需要2分钟。
内容图文
在我的代码中,我试图使用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的copy.deepcopy()的问题?全部内容,希望文章能够帮你解决如何针对自定义类型调试调用Python的copy.deepcopy()的问题?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。