开发Alexa技能向Replit DB存数据时触发Circular Reference错误如何解决?
错误原因
- Replit数据库存储数据时会先将数据序列化为JSON格式,你直接将自定义
Identity类的实例存入数据库,默认的序列化逻辑无法正确处理自定义类对象,且如果Identity类内部存在自引用属性、或者你重复存入同一个实例的多个引用,就会触发循环引用报错。 - 你的代码里存在大量同一实例的别名赋值:比如
orb = tri、quad = tor、akr = lir、aks = lis,这些变量指向同一个内存地址的对象,重复存入数据库时序列化器检测到重复引用,也会触发报错。 - 代码还存在多处笔误,会导致数据不符合预期:
- 定义
aro时错误修改了ace的name和description属性,覆盖了之前定义的无性恋相关数据 - 定义
tor时错误修改了tri的description属性 - 定义
aks时错误修改了lis的name属性
- 定义
解决方案
第一步:修复别名赋值和笔误
所有别名身份单独创建Identity实例,不要直接赋值引用,同时修正所有笔误:
# 原orb = tri改为: orb = Identity() orb.name = "Orbisian" orb.description = tri.description # 描述和tri一致就直接复用值,不要复用实例 # 原quad = tor改为: quad = Identity() quad.name = "Quadrisian" quad.description = tor.description # 原akr = lir改为: akr = Identity() akr.name = "Akoiromantic" akr.description = lir.description # 原aks = lis改为: aks = Identity() aks.name = "Akoisexual" aks.description = lis.description # 修正aro相关笔误 aro = Identity() aro.name = "Aromantic" # 原代码写成了ace.name aro.description = "Umbrella term for not experiencing or having a non-conventional form of experiencing romantic attraction." # 原代码写成了ace.description # 修正tor相关笔误 tor.description = "Exclusive attraction to men by non binary people." # 原代码写成了tri.description
第二步:改为存入字典类型数据
不要直接存入Identity实例,转成可被JSON序列化的字典结构再存储:
# 可以写一个通用转换函数,也可以手动转换 def identity_to_dict(iden): return { "name": iden.name, "description": iden.description } # 存储时调用转换 db[0] = identity_to_dict(les) db[1] = identity_to_dict(gay) # 其他所有存储项都按这个方式修改
第三步:调整读取逻辑
后续读取数据时,将读取到的字典再转回Identity实例即可:
def get_identity(name): for key in db.keys(): val = db[key] if isinstance(val, dict) and val.get("name") == name: iden = Identity() iden.name = val["name"] iden.description = val["description"] return iden return None
内容的提问来源于stack exchange,提问作者CassieCodes
相关产品推荐
相关产品推荐

