API 指南#

API 的一致性和稳定性非常重要;因此,只有在增加的好处值得调整现有代码的努力时,才会进行 API 更改(例如签名更改、行为更改、移除)。

因为我们是一个可视化库,我们的主要输出是用户看到的最终可视化结果;因此,图形的外观是API的一部分,任何变化,无论是语义上的还是 美学上的 ,都是向后不兼容的API变化。

添加新的API和功能#

每个未明确标记为私有(即以单下划线开头)的新函数、参数和属性都将成为 Matplotlib 的公共 API 的一部分。如上所述,更改现有 API 是繁琐的。因此,在添加新 API 时要特别小心:

  • 通过在前面加上下划线,将标记辅助函数和内部属性标记为私有。

  • 仔细考虑为你的函数和变量取个好名字。

  • 尝试采用 Matplotlib API 现有部分的样式和命名约定。

  • 尽可能多地使用仅关键字参数。另请参阅 API 演进的正确方式 -- 兼容地添加参数

弃用 API#

在 Matplotlib 中进行的 API 更改必须遵循以下弃用流程,除非开发团队认为在极少数情况下有必要。通常,API 弃用分为两个阶段:

  • 介绍: 警告用户 API 发生变化

  • 过期: API 介绍期内所述进行了更改

这确保了在更改生效之前通知用户,从而防止代码意外中断。

规则#

  • 弃用功能针对的是下一个 :ref:`meso 版本 <pr-milestones>`(例如 3.x)

  • 弃用的API通常在引入弃用后的两个点发布后被移除(过期)。核心开发者可以根据具体情况实施更长的弃用期,以便为过渡提供更多时间。

  • 在弃用期间,旧的API必须保持完全功能。

  • 如果存在已弃用API的替代方案,它们应在弃用期间可用。

  • 如果有疑问,关于API变更的决定最终由 API一致性负责人 开发者做出。

引入弃用#

  1. 创建 弃用通知

  2. 如果可能,当使用已弃用的API时,发出一个 MatplotlibDeprecationWarning 。为此有许多辅助工具:

    • 使用 _api.warn_deprecated() 进行一般的弃用警告

    • 使用装饰器 @_api.deprecated 来弃用类、函数、方法或属性

    • 使用 @_api.deprecate_privatize_attribute 来标注属性的弃用,同时保留内部的私有版本。

    • 要警告函数签名的变化,请使用装饰器 @_api.delete_parameter@_api.rename_parameter@_api.make_keyword_only

    所有这些辅助工具都接受一个名为 since 的第一个参数,该参数应设置为下一个点发布版本,例如“3.x”。

    你可以在 alternative 中使用标准的 rst 交叉引用。

  3. 对关联的 .pyi 文件中的类型提示进行适当修改。一般指导原则是匹配运行时报告的行为。

    • 标记为 @_api.deprecated@_api.deprecate_privatize_attribute 的项目通常在过期期间内保留,因此在引入时不需要进行更改。

    • 使用 @_api.rename_parameter@_api.make_keyword_only 装饰的项目在运行时报告 新*(弃用后)的签名,因此 *应该 在引入时更新。

    • 使用 @_api.delete_parameter 装饰的项目应为已删除的参数包含一个默认值提示,即使它之前没有默认值(例如 param: <type> = ...)。

过期弃用#

  1. 创建 弃用公告 。对于内容,您通常可以复制弃用通知并稍作调整。

  2. 修改代码功能并移除所有相关的弃用警告。

  3. 对关联的 .pyi 文件中的类型提示进行适当修改。

    • 标记为 @_api.deprecated@_api.deprecate_privatize_attribute 的项目将在到期时被移除。

    • 使用 @_api.rename_parameter@_api.make_keyword_only 装饰的项目在引入时已经更新,现在不需要更改。

    • 使用 @_api.delete_parameter 装饰的项目需要更新到最终签名,方式与 .py 文件签名更新相同。

    • ci/mypy-stubtest-allowlist.txt 中的任何条目,如果指示了弃用版本,应进行双重检查。虽然在大多数情况下这是不必要的,但有些项目从一开始就没有类型提示,而是被添加到了这个文件中。对于那些不在存根文件中的已移除项目,只需从允许列表中删除即可。

宣布新的和弃用的API#

当以向后不兼容的方式添加或更改API时,请添加适当的 版本控制指令 并在发布说明中记录它,并将条目添加到适当的文件夹中:

版本控制指令

公告文件夹

新功能

.. versionadded:: 3.N

doc/users/next_whats_new/

API 变更

.. versionchanged:: 3.N

doc/api/next_api_changes/[kind]

在弃用API时,请按照 弃用指南 中的描述添加通知,并在此处总结:

阶段

公告文件夹

引入弃用

doc/api/next_api_changes/deprecation

过期弃用

doc/api/next_api_changes/[kind]

通常,介绍通知可以重新用于过期通知,因为它们预计会描述相同的API变更和移除。

版本控制指令#

在进行向后不兼容的更改时,请在文档字符串中添加版本控制指令。指令应放置在描述块的末尾。例如:

class Foo:
    """
    This is the summary.

    Followed by a longer description block.

    Consisting of multiple lines and paragraphs.

    .. versionadded:: 3.5

    Parameters
    ----------
    a : int
        The first parameter.
    b: bool, default: False
        This was added later.

        .. versionadded:: 3.6
    """

    def set_b(b):
        """
        Set b.

        .. versionadded:: 3.6

        Parameters
        ----------
        b: bool

对于类和函数,指令应放在 参数 部分之前。对于参数,指令应放在参数描述的末尾。微版本号被省略,且指令不应添加到整个模块中。

发行说明#

对于更新日志和新增内容,请避免在章节标题中使用交叉引用,因为这会导致目录中的链接变得混乱。相反,请确保在描述性文本中包含交叉引用。

API 变更说明#

未来版本的API变更说明收集在 doc/api/next_api_changes/ 中。它们被分为四个子目录:

  • 弃用:未来变更的公告。通常,这些变更会引发一个弃用警告,使用此API的用户应更改其代码以保持与未来Matplotlib版本的兼容性。如果可能,请说明应使用什么替代方案。

  • 移除: 被移除的API部分。如果可能,说明应该使用什么替代。

  • 行为变化:保持有效但会产生不同结果的API。

  • 开发变更:对构建过程、依赖项等的更改。

请将新条目放在这些目录中,并使用名为 99999-ABC.rst 的新文件,其中 99999 是 PR 编号,ABC 是作者的姓名首字母。通常,每个更改都会有自己的文件,但在适当的情况下,您也可以修改现有文件。总体目标是提供一个易于理解的更改文档。

一个典型的条目可能看起来像这样:

Locators
~~~~~~~~
The unused `Locator.autoscale()` method is deprecated (pass the axis
limits to `Locator.view_limits()` instead).

请避免在章节标题中使用引用,因为这会导致目录中的链接变得混乱。相反,请确保在描述性文本中包含引用。

新功能说明#

请将 whats_new.rst 的新部分放置在 doc/users/next_whats_new/ 目录中。

在添加条目时,请查看当前已有的文件,看看是否可以扩展其中的任何一个。如果你创建一个文件,如果你添加了一个全新的功能,可以命名为 cool_new_feature.rst,或者对于现有功能的扩展,可以命名为 updated_feature.rst

包含以下形式的内容:

Section title for feature
-------------------------

A bunch of text about how awesome the new feature is and examples of how
to use it.

A sub-section
~~~~~~~~~~~~~

请避免在章节标题中使用引用,因为这会导致目录中的链接变得混乱。相反,请确保在描述性文本中包含引用。