如何传递类型提示共享存根?

How to share stubs for type hinting transitively?

我目前使用的 Python 库 (x) 没有类型提示。我选择为我在项目中使用的 x 方法添加存根文件,如下所示:

MyProject_1/
  stubs/
    x/ 
      __init__.pyi  # Contains type hints for any attributes of `x`.

  package_1/
    package_1_main.py  # Imports `x`.
    __init__.py   
    py.typed  # Indicates package 1 type hints are specified inline.

  setup.py  # Specifies `x` as a dependency under `install_requires` and `py.typed` under `package_data`.

然后在MyProject_1目录下,我运行MYPYPATH=stubs mypy ..

如果 package_1_main.py 导入 x,则 mypy 成功键入提示 x 基于 stubs/x 的导入。这里一切都很好。

现在我做了另一个依赖于 MyProject_1 My_Project_2 的项目 MyProject_2 成功地使用了 package_1_main.py 中指定的内联类型提示,因为 py.typedpackage_1.

问题是 MyProject_2 没有在 stubs/x 接听。由于 xMyProject_2MyProject_1 的传递依赖,我有能力在 MyProject_2 中使用 x。但是,这没有 stubs/x.

下指定的类型提示

我可以想象有 3 种方法可以使用这些存根(从而访问 x 的类型提示):

  1. MyProject_1下的stubs目录添加到MyProject_2运行宁mypy .时的MYPYPATH。缺点是它取决于 MyProject_1 是如何通过 pip 安装的,并且 stubs 必须作为 setup.py.[=49 中的分发包数据的一部分=]

  2. MyProject_1下的stubs目录复制到MyProject_2,手动保持同步。缺点是维护开销。

  3. 创建名为 MyProject_Stubs 的第三个项目,专门用于保留依赖于 x 的任何项目的存根文件,无论是传递还是直接。缺点是一个专门用于存根的项目。

还有其他我可以考虑的方法吗?对于有点自以为是的部分:这些方法中哪一种似乎具有最大的净优势?

据我所知,无法传递共享存根。

相反,您必须专注于寻找使您的存根对两者可用的方法 projects/making 它是两者的依赖项。

大致有六种不同的方法,我将按照大致递增的顺序列出这些方法。

  1. 将你的存根存储在本地计算机的某个位置,并让你的两个项目通过 MYPYPATH 环境变量或配置文件选项引用它。

    这样做相对简单,但缺点是您的项目只能在您的本地计算机上运行。如果您计划让其他人使用此项目,他们将需要获取您的存根并设置他们的 MYPYPATH。

  2. 将存根复制到第二个项目。正如您所说,这里的主要缺点是您现在需要手动保持存根同步。

  3. 为您的存根创建一个单独的 git 存储库,并将它们作为 git submodule 添加到您的两个项目中。

    这解决了选项 2 的代码重复问题。唯一真正的缺点是每次更新存根存储库时,您都需要记住在两个项目中修改子模块引脚。

  4. 为您的项目提供类型提示 typeshed a repository of type hints for Python and either wait for the next mypy release or run mypy with the --custom-typeshed-dir flag/config 选项。

    请注意,Typeshed 接受 partial stubs and is hoping on switching to a more iterative and rapid release cadence 将来的某个时间。

    如果您想广泛地 open-source 您的工作,但不一定想要在 open-source 之后维护您的存根,那么此选项将是最好的选择。

    主要缺点是您无法立即解除封锁。

  5. 创建一个包含 py.typed 文件的 X-stubs 包。这有点像你的选项 3,除了你的新项目明确地只用于项目 X 的​​存根并且是 open-sourced.

    然后您可以将 X-stubs 包添加到您的 pip 依赖项中,就像任何 pip 包一样,甚至最终可能会更广泛地研究 open-sourcing 并分发它们。

    这与您的选项 3 基本相同,除了您的包的名称不同并且不太特定于您的项目。

  6. 向项目 X 提交拉取请求,添加 py.typed 文件以及一些类型提示,并说服他们登陆它。

    当然,这说起来容易做起来难 -- 当然,并非所有项目都愿意接受类型提示,因为这可能会增加它们的维护负担。

如果您只关心解除阻塞,我会选择选项 1-3。如果您还想尝试 open-sourcing 您的工作并帮助改善 Python 打字生态系统,那么其他选项更适合。

我会避免你的选项 1 -- 它似乎涉及与我的选项 3 和 5 大致相同的设置工作量,同时还需要在项目 2 中进行更多工作才能使用。