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时出现递归错误 的相关文章

  • 通过 add_subplot 添加子图后如何共享轴?

    我有一个像这样的数据框 df pd DataFrame A 0 3 0 2 0 5 0 2 B 0 1 0 0 0 3 0 1 C 0 2 0 5 0 0 0 7 D 0 6 0 3 0 4 0 6 index list abcd A B
  • sklearn 估计器管道的参数无效

    我正在实现 O Reilly 书中的一个示例 Python 机器学习简介 使用 Python 2 7 和 sklearn 0 16 我正在使用的代码 pipe make pipeline TfidfVectorizer LogisticRe
  • 如何(重新)命名 pandas 数据框中的空列标题而不导出到 csv

    我有一个熊猫数据框df1带有一个索引列和一系列未命名的值 我想为未命名的系列指定一个名称 到目前为止 我知道的唯一方法是导出到df1 csv using df1 to csv df1 csv header Signal 然后使用以下命令重新
  • 在Python中,如何将矩阵逆时针旋转90度?

    gt gt gt def rotate matrix k List List int For example if I have m 1 2 3 2 3 3 5 4 3 rotate matrix m should give me 3 3
  • 如果 Excel 文件是由程序创建的,Pandas read_excel 对于具有简单公式的单元格返回 nan [重复]

    这个问题在这里已经有答案了 I use pd read excel读取由以下命令创建的 excel 文件openpyxl并从一个网址下载 解析后的数据框将给出nan如果单元格值是公式 which formula is simply 100
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • 高级描述熊猫

    有没有像 pandas 那样更高级的功能 通常我会继续这样 r pd DataFrame np random randn 1000 columns A r describe 我会得到一份很好的总结 就像这样 A count 1000 000
  • Python-验证我的文档 xls 中是否存在工作表

    我正在尝试在空闲时间设计一个小程序 加载 xls 文件 然后在要扫描的文档中选择一张纸 步骤1 用户导入 xls文件 导入程序后检查文件是否存在 我能做到的 第 2 步 我要求用户提供要分析的文档表 xls 的名称 这就是它停止的地方 该程
  • 使用 if 语句的网格网格和用户定义函数的真值不明确

    假设我有一个函数f x y 足够光滑 然而 有些值仅在有限的意义上存在 以sin x x的价值x 0只存在于极限 x gt 0 中 在一般情况下 我用一个来处理这个问题if陈述 如果我在情节中使用它meshgrid我收到一条错误消息 Val
  • python Recipe:列出最接近等于值的项[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 考虑像这样的列表 0 3 7 10 12 15 19 21 我想获得最接近任何值的最近的最小数字 所以如果我通过4 我会得到3 如果我
  • 如何按 pandas 中的值对系列进行分组?

    我现在有一只熊猫Series与数据类型Timestamp 我想按日期对其进行分组 并且每组中有许多行具有不同的时间 看似显而易见的方法类似于 grouped s groupby lambda x x date 然而 熊猫的groupby按索
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import

随机推荐

  • 如何在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