具有多态性的Python棉花糖树结构

2023-12-06

我有以下树结构代码:

class Node:
    def __init__(self, node_id: str):
        self.node_id = node_id
        self.children = []

    def add_child(self, node: 'Node'):
        if isinstance(node, Node):
            self.children.append(node)


class ValueNode(Node):
    def __init__(self, value: bool, **kwargs):
        Node.__init__(self, **kwargs)
        self.value = value


class LogicNode(Node):
    def __init__(self, logic_operator: str, **kwargs):
        Node.__init__(self, **kwargs)
        self.logic_operator = logic_operator


a = Node("a")
b = LogicNode("or", node_id="b")
c = ValueNode(True, node_id="c")
d = ValueNode(False, node_id="d")

b.add_child(c)
b.add_child(d)
a.add_child(b)

如何序列化对象a转换成 json 并再次转换成 python 对象,同时保持正确的类型和树结构?

我尝试过的:

我正在尝试将此树结构序列化为 json,以便通过 API 发送到 ui。我发现了棉花糖,但不幸的是,我不知道该怎么做。我把它作为 atm 模式。

class NodeSchema(Schema):
    node_id = fields.String()
    children = fields.Nested('self', many=True)

    @post_load
    def load(self, data):
        return Node(**data)


class ValueNodeSchema(NodeSchema):
    value = fields.Boolean()


class LogicNodeSchema(NodeSchema):
    logic_operator = fields.String()

这里的问题是,当序列化为 json 时,即使子节点是逻辑节点或值节点(有点预期),也只有 Node 的属性存在。我发现了 marshmallow-oneofschema这里是github但我无法使用它,因为我必须替换它:

# In NodeSchema
children = fields.Nested('self', many=True)

with:

class SomeNodeSchema(OneOfSchema):
    type_schemas = {
        'node': NodeSchema,
        'logic_node': LogicNodeSchema,
        'value_node': ValueNodeSchema,
    }

    def get_obj_type(self, obj):
        if isinstance(obj, LogicNode):
            return 'logic_node'
        if isinstance(obj, ValueNode):
            return 'value_node'
        elif isinstance(obj, Node):
            return 'node'

# In NodeSchema
children = fields.Nested(SomeNodeSchema, many=True)

但这会导致循环导入,从而使其变得不可能。


我发现了 marshmallow-oneofschema

虽然没有集成到核心,但我认为 marshmallow-oneofschema 是实现多态性的推荐方法。

这会导致循环导入

您可以将名称作为字符串传递来解决循环导入问题。

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

具有多态性的Python棉花糖树结构 的相关文章

  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • Spring Data Neo4j -repository.save 和 @Indexed(unique=true)

    今天我尝试了Spring Data Neo4j 终于可以使用了somehow 我在用着 春季4 0 2 Spring数据Neo4j 3 0 0 查询DSL 3 3 1 Neo4j 2 0 1 这是我的配置 Configuration Ena
  • Joomla 和 MySQL

    Joomla 上是否有关于在 PHP 中通过 MySQL 进行数据库查询的具体文档 我真正在寻找什么 Joomla 是否实现了自己的数据库包装器 如果没有 建议使用指定的配置参数创建一个 Joomla 是否能够参数化其查询以防止 SQL 注
  • 部分唤醒锁不起作用

    我的应用程序有activities和背景service必须运行24 7 我的应用程序必须通过以下方式与服务器通信Wi Fi发送和接收信息 Problem 每当服务器发送任何警报时 我的应用程序都应该接收并弹出该应用程序 无论它是在前台还是后
  • 在 ~/.bashrc 中设置的变量并在 shell 脚本中访问它们

    我在 bashrc 的最顶部有这个 before非交互式 shell 的返回 FOO BAR export FOO echo HELLO WORLD If not running interactively don t do anythin
  • List 上的 BinarySearch 似乎返回奇怪的结果

    我对 C 很陌生 我创建了一个 List 对象 然后对特定项目执行 BinarySearch 但搜索结果似乎很奇怪 这是代码 class Element public int x public Element int val x val c
  • 如何在 jQuery 悬停菜单中保持子菜单打开?

    我上周刚刚开始使用 jQuery 进行编码 需要一些帮助来弄清楚如何使菜单正常工作 我有 3 个选项卡 每个选项卡都有自己的菜单 当显示页面时 会自动显示菜单和子菜单 显示后 用户可以将鼠标悬停在选项卡上以查看其他子菜单 当他们停止悬停时
  • 为什么 Mule App xml 的架构验证对于 Java 组件绑定失败?

    我在我的 mule 应用程序中配置了以下组件绑定
  • 我看不到与信标相关的附近通知

    我的设备昨天更新了谷歌服务应用程序 我已经测试过谷歌附近的通知在 Android 上有两个信标 一个 iBeacon 和一个 Eddystone UID 这些信标处于活动状态 并且已在平台中正确注册 我看到它们已在 Android Beac
  • Hibernate 5 中 org.hibernate.Transactions.isActive() 的替换

    我正在从 hibernate 4 2 17 迁移到 5 0 7 到目前为止效果很好 但该方法似乎isActive已弃用 我只是不能再使用它了 这是我的代码 public void starteTransaktion try getMySes
  • 使用形状笛卡尔和 matplotlib 绘制断开连接的实体

    我需要绘制一个断开的圆圈列表 这些圆圈是我为其他目的而创建的 我试图完全按照中的示例进行操作http toblerity org shapely manual html cascading unions显示 参见code 但只有当圆圈重叠并
  • 是否可以在 Common Lisp 中定义递归类型?

    递归类型是一种具有基数和自身递归情况的类型 我希望它实现 类型化列表 即其conses仅允许相同元素类型或nil的列表 我尝试了以下定义 deftype list of a or null cons a list of a 然而 这表明由于
  • 在 Visual Basic 中连接控件,控制控件

    我正在使用 Visual Basic Visual Studio 2010 创建动态创建的控件 本质上 我正在做的是创建一个标签 一个文本框 一个标签 将充当秒表 和一个按钮 用于控制所述秒表 每组控件将按如下方式排列 并命名 LABEL
  • 带有圆角和阴影 Kivy 的图像

    How can I do something like this with Kivy 使用按钮的背景 正常 背景 向下 and border为了达成这个 让我们将您提供的两张图片命名为正常 png and down png 详细信息请参考下
  • Cordova 插件 - 添加第三方 sdk

    我正在尝试为以下 sdk 创建插件 https ktplayhelp zendesk com hc en us articles 221071888 Android 在设置项目配置点中 它告诉我们通过在 Android studio 中导入
  • 如何在使用 SQL Server 插入/更新之前验证数据?

    我有一个这样定义的表 CREATE TABLE dbo ObjectRelationClauses Id INT NOT NULL PRIMARY KEY IDENTITY RelationId INT NOT NULL OperatorT
  • 在 REST 应用程序中为当前登录用户设计 URI

    我的 REST API 中需要一个 URI 来检索当前登录的用户 通常我使用GET具有 ID 的资源 但客户端不知道用户的 ID 我找到了以下解决方案 按用户名 此解决方案使用用户名而不是用户的 ID Example Bitbucket R
  • Visual Studio 2010 SP1 中缺少 MVC3

    我安装了VS 2010 Ultimate 它没有 MVC3 我安装了 SP1 它应该也安装了更新以及 MVC3 对吗 但安装后 我在新项目窗口中仍然没有 MVC3 选项 这是怎么回事 MVC3 是可选下载 http www asp net
  • LinkedIn 网站分享始终显示 1 分钟阅读

    我正在尝试找出如何删除1 min read在我向 LinkedIn 分享内容时的描述中 1 分钟阅读示例 我在页面上有打开的图表标签 并验证它们不会在页面上的任何位置显示 1 分钟阅读时间 我也玩过 og type 尝试 文章 媒体 视频
  • ASP.NET Web API 身份验证

    我希望在使用时从客户端应用程序对用户进行身份验证ASP NET Web API 我观看了网站上的所有视频并阅读了这个论坛帖子 把 Authorize 属性正确返回一个401 Unauthorized地位 但是 我需要知道如何允许用户登录 A
  • 具有多态性的Python棉花糖树结构

    我有以下树结构代码 class Node def init self node id str self node id node id self children def add child self node Node if isinst