MEP25: 序列化#

状态#

被拒绝

这项工作很重要,但这次特别的努力已经停滞了。

分支和拉取请求#

  • 开发分支:

  • 相关拉取请求:

摘要#

本 MEP 旨在添加一个可序列化的 Controller 对象,作为 Artist 的管理者。用户将通过 ControllerArtist 进行通信。这样,Controller 对象的功能可以逐步增加,因为每个 Artist 仍然负责绘制所有内容。目标是创建一个既适用于需要图形高层次描述的图形库,也适用于需要低层次解释的库的 API。

详细描述#

Matplotlib 是一个核心绘图引擎,其API已被许多用户所理解。其他图形库很难(1)获取完整的图形描述,(2)将图形对象的原始数据输出为用户提供的数据,(3)在不使用启发式方法的情况下理解图形对象的语义,以及(4)向matplotlib提供完整的图形描述以进行可视化。此外,由于 Artist 在图形中没有自己的语义概念,因此很难以自然的方式与之交互。

从这个意义上说,matplotlib 将采用标准的 Model-View-Controller (MVC) 框架。模型 是用户定义的数据、样式和语义。视图 是每个单独 Artist 的集合,它们负责根据 模型 生成最终图像。控制器 将是管理其 Artist 对象集合的 Controller 对象。

Controller 必须能够根据命令导出其携带的关于图形的信息,可能是通过 to_json 方法或类似的方式。因为复制模型中的所有信息到控制器中会非常多余,所以只明确保留用户指定的信息(数据 + 样式)。如果用户想要从视图/模型中获取更多信息(默认值),它应该能够查询这些信息。

  • 这可能会很烦人,未指定的 kwargs 是从 rcParams 对象中提取的,该对象反过来是从用户指定的文件中读取的,并且可以在运行时动态更改。我想我们可以保留一个默认默认值的字典并与之比较。不清楚这将如何与样式表 [[MEP26]] 交互 - @tacaswell

附加说明:

  • “原始数据” 不一定需要是一个 列表ndarray 等。相反,它可以更抽象地仅在需要时有一个生成数据的方法。

  • 因为 Controller 将包含用户可能不希望保留的额外信息,所以它不应该默认创建。你应该能够同时 (a) 用图形实例化一个 Controller 和 (b) 用 Controller 构建一个图形。

用例:

  • 导出所有必要信息

  • 序列化一个 matplotlib 图形,保存它,并能够在以后重新运行。

  • 任何其他源向 matplotlib 发送适当格式的表示以打开

示例#

以下是控制器应能执行的一些示例。

  1. 从序列化表示(例如,JSON)实例化一个 matplotlib 图形:

    import json
    from matplotlib.controllers import Controller
    with open('my_figure') as f:
        o = json.load(f)
    c = Controller(o)
    fig = c.figure
    
  2. 从控制器管理艺术家(例如,Line2D):::

    # not really sure how this should look
    c.axes[0].lines[0].color = 'b'
    # ?
    
  3. 导出可序列化的图形表示::

    o = c.to_json()
    # or... we should be able to throw a figure object in there too
    o = Controller.to_json(mpl_fig)
    

实现#

  1. 创建能够管理 Artist 对象(例如,Hist)的基 Controller 对象。

    注释:

    • 初始化应通过解包 ** 进行,因此我们需要一个调用签名参数的副本,用于我们最终试图控制的 Artist 。不幸的硬编码重复...

    • 是否应该在 Controller 中跟踪每个 Artist 接受的额外 **kwargs

    • Controller 如何知道哪个艺术家属于哪里?例如,我们需要传递 axes 引用吗?

    进度:

  2. Controller 编写协议以 更新 模型。

    注释:

    • 应该如何处理容器?例如,当我们重新分箱一个直方图时,旧的补丁会发生什么?

    • 在链接 (1) 中,旧行被完全销毁并重新绘制,如果有什么东西引用了它怎么办?

  3. 创建一个方法,可以从 Controllers 组装一个 json 对象

  4. 处理图形的不可序列化方面(例如,非仿射变换?)

  5. 能够从序列化表示中实例化

  6. 重新实现现有的 pyplot 和 Axes 方法,例如 pyplot.histAxes.hist,基于新的控制器类。

> @theengineer: 在 #2 中,你说的从每个 Artist 那里 获取更新 是什么意思?

^ 是的。Controller 不应该 需要更新。这只是在 #3 中发生。当你看到这个时,删除评论。

向后兼容性#

  • pickling 将会改变

  • 非仿射变换将需要定义一个序列化方法

替代方案#

PR #3150 建议通过寄生方式将额外容器附加到轴对象上来添加语义。这是一个更完整的解决方案,应该是一个更发达/灵活/强大的框架。