python copy.deepcopy时出现递归错误

2023-12-30

我在 python 中遇到问题。

我有一堂定制课__getattr__

class ChoiceNumToName(object):
    def __init__(self, django_choice_tuple):
        self.ods_choice_tuple = django_choice_tuple
        self.choice_data = {}
        self.choice_point = -1
        for choice_value, choice_name in django_choice_tuple:
            self.choice_data.setdefault(choice_name, choice_value)

    def __getattr__(self, item):
        if item in self.choice_data:
            return self.choice_data[item]
        else:
            raise AttributeError("no attribute %s" % item)

    def __str__(self):
        return str(self.ods_choice_tuple)

    def __iter__(self):
        self.choice_point = -1
        return self

    def __next__(self):
        self.choice_point += 1
        try:
            return self.ods_choice_tuple[self.choice_point]
        except IndexError:
            raise StopIteration()

当我执行这个时

a = ChoiceNumToName((
    (1, "running"),
    (2, "stopped"),
))
b = copy.deepcopy(a)

它提高RecursionError: maximum recursion depth exceeded while calling a Python object

要解决此问题,请更改示例__getattr__函数到此

def __getattr__(self, item):
    if item == "__setstate__":
        raise AttributeError(item)
    if item in self.choice_data:
        return self.choice_data[item]
    else:
        raise AttributeError("no attribute %s" % item)

效果很好。

我从这里知道这个解决方案https://github.com/python-babel/flask-babel/commit/8319a7f44f4a0b97298d20ad702f7618e6bdab6a https://github.com/python-babel/flask-babel/commit/8319a7f44f4a0b97298d20ad702f7618e6bdab6a

但谁能告诉我为什么?


总而言之:你的__getattr__之前被调用choice_data已被添加到实例字典中,这导致它无限递归。解决该问题的更好方法是立即引发以任何开头的属性的 AttributeError__捕获任何其他特殊或内部属性。

发生这种情况是因为当复制一个对象时__init__方法未被调用。相反,创建了一个新的空对象。这个新对象有一个空的__dict__。 Python 的 pickle 协议(也用于复制模块)有一个钩子__setstate__允许自定义应用状态(通常只是内容__dict__但是,例如如果__getstate__提供,它可以是任何对象)。查看该钩子是否存在hasattr(newobj, '__setstate__')被称为which,因为没有任何__setstate__在 MRO 或__dict__导致你的__getattr__被称为。你的__getattr__然后尝试访问self.choice_data但是,正如我们之前指出的__dict__目前为空。这导致__getattr__再次调用方法来获取choice_data启动无限递归的属性。

特殊外壳__setstate__通过提前跳出查找来阻止递归被触发__setstate__。当失败时,默认的复制机制将生效,初始化新对象的__dict__来自国家。在我看来只有特殊的外壳__setstate__不是最好的解决方案。我认为最好立即针对任何特殊或内部属性(即以__,因为这样可以防止其他奇怪情况的发生。另一种可能性是避免在内部使用属性查找__getattr__通过写作self.__dict__['choice_data'] or object.__getattribute__(self, 'choice_data')。您还可以确保choice_data将通过实施来呈现__new__并将其分配给那里的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python copy.deepcopy时出现递归错误 的相关文章

  • 用于将 cython 中的许多 C++ 类包装到单个共享对象的项目结构

    我在文档 邮件列表和这个问题在这里 https stackoverflow com questions 10300660 cython and distutils 但我想得到一个更直接的答案来解决我的具体情况 我正在通过尝试一点一点地包装我
  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo

随机推荐

  • 如何在javascript中监视窗口选择更改事件

    有没有办法监听window selection的change事件 类似于回调 当用户选择不同的内容时调用 如果您使用的是 jQuery 并且您想要处理 ID 为 的特定项目的选择myInput 你可以这样做 myInput select f
  • 如何在 SQLPlus 或 PL/SQL 中制作菜单?

    我正在制作这个程序 它有一个菜单 可以获取用户的输入并根据他 她的选择执行特定的脚本 大致如下 Please make a selection 1 Do script a 2 Do script b 3 Do script c 我看了这个链
  • 从 MongoDB 中删除重复项

    你好 我在 mongodb 中有大约 500 万个文档 复制 每个文档有 43 个字段 如何删除重复的文档 我尝试过 db testkdd ensureIndex duration 1 protocol type 1 service 1 f
  • 如何将 3d numpy 数组转换为 2d

    我有一个像这样的 3d 矩阵 np arange 16 reshape 4 2 2 array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 并想以网格格式堆叠它们 最终得到 array 0 1 4 5 2 3
  • TLS V 1.1 和 TLS V 1.2 iOS 问题

    有几个问题 如果我的服务器已经运行 TLS1 2 我是否还需要将 NSAppTransportSecurity 功能添加到我的 info plist 中 如果是 为什么 不是所有运行 iOS9 或 gt iOS10 11 版本的苹果设备都可
  • 将列表元素的连续重复项打包到 Prolog 中的子列表中

    我无法返回问题 9 的答案P 99 九十九个 Prolog 问题 http www ic unicamp br meidanis courses mc336 2009s2 prolog problemas 将列表元素的连续重复项打包到子列表
  • Tradingview的自动调整比例功能:排除指标的绘图

    我有一个指标 可以自动压缩 Y 轴上的整个价格图表 所以我必须在大多数情况下让它不可见 即使双击 y 尺度 图表自动调整功能 也可以包含所有可见指标 有没有办法阻止一个或所有指标这样做 哦 我刚刚找到了答案 只需右键单击 y 刻度即可调出带
  • 如何在 Linux 上将光标锁定在窗口内部?

    我正在尝试为 Linux 制作一款游戏 其中涉及大量快速动作和鼠标光标的快速移动 如果用户想在窗口模式下玩 我很想将光标锁定在窗口内部 以避免在激烈的战斗中意外更改程序 显然 如果用户更改程序或按退出键 这会自行取消 暂停菜单 在 Wind
  • 随机访问 C++ 和 Python 时 Linux 内存映射文件性能不佳

    在尝试使用内存映射文件创建多 GB 文件 大约 13 GB 时 我遇到了 mmap 的问题 最初的实现是在 Windows 上使用 boost iostreams mapped file sink 在 c 中完成的 一切顺利 然后代码在 L
  • 在非连续版本之间迁移时出现核心数据迁移错误

    问题 我的核心数据模型有 13 个版本 我制作了 13 个映射模型 V1 V2 V2 V3 等 我已经打开了自动迁移 在两个连续版本 例如 V12 V13 之间迁移时 迁移工作完美 在两个非连续版本 例如 V11 V13 之间迁移时 迁移失
  • 插入到已经排序的列表中

    对于 Java 我有一个名为 TestClass 的类 它有一个名为 Name 的成员 它是一个字符串 我还有一个这种类型的 ArrayList 它已经按名称字母顺序排序 我想要做的是找到放置 TestClass 新实例的最佳索引 到目前为
  • PHP 命名空间覆盖 Use 语句

    谁能告诉我是否可以覆盖 use 语句 我的示例是有一个 MVC 设置 其中的核心代码能够使用扩展核心版本的自定义版本覆盖每个控制器 模型 我面临的问题是我的核心控制器有一个 use 语句告诉它使用核心模型 所以如果我扩展模型 我不知道如何告
  • 如何使C程序的堆栈可执行?

    有没有办法通过编译使C程序的堆栈可执行 I did gcc o convert g convert 然后运行 readelf l convert 检查堆栈是否可执行 但输出为 GNU STACK 0x000000 0x00000000 0x
  • pandas groupby 中的行联合

    我有一个看起来像这样的大数据框 并且可以复制粘贴df pd read clipboard sep s s user nm month unique ips shifted ips halves quarters mo pairs 10011
  • 更新 Clojure 中的分层/树结构

    我有一个 Atom 比如 x def x atom name A id 1 children name B id 2 children name C id 3 children name D id 4 children 并且需要更新子图 例
  • 通过分组将对象添加到 NSMutablearray

    我希望我的 NSArray SampleData 从 parse com 数据库接收实际数据 假设如下 self sampleData date 12 5 2014 group text post1 location x y text po
  • Java 添加格式为 dd:HH:mm:ss 的日期

    我有三个日期String格式的对象 dd HH mm ss 00 1 9 14 00 3 10 4 00 3 39 49 如何在 Java 中添加这些日期以获得总和 00 7 59 07 示例代码 SimpleDateFormat sdf
  • Acumatica 和 Outlook 插件以及 Azure 单点登录错误

    与 Acumatica 的 Outlook 插件相关 当我们的用户尝试使用其 azure 登录名进行身份验证时 我们会看到以下错误 https www dropbox com s le7t3ez5ua69qls Screenshot 202
  • 如何使用javascript在浏览器html输出中漂亮地打印常见语言的源代码?

    如何使用javascript在浏览器html输出中漂亮地打印常见语言的源代码 我的意思是有一些缩进和代码格式 目前我只得到了http alexgorbatchev com SyntaxHighlighter http alexgorbatc
  • python copy.deepcopy时出现递归错误

    我在 python 中遇到问题 我有一堂定制课 getattr class ChoiceNumToName object def init self django choice tuple self ods choice tuple dja