如何传递类型提示共享存根?
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.typed
在 package_1
.
下
问题是 MyProject_2
没有在 stubs/x
接听。由于 x
是 MyProject_2
到 MyProject_1
的传递依赖,我有能力在 MyProject_2
中使用 x
。但是,这没有 stubs/x
.
下指定的类型提示
我可以想象有 3 种方法可以使用这些存根(从而访问 x
的类型提示):
将MyProject_1
下的stubs
目录添加到MyProject_2
运行宁mypy .
时的MYPYPATH
。缺点是它取决于 MyProject_1
是如何通过 pip
安装的,并且 stubs
必须作为 setup.py
.[=49 中的分发包数据的一部分=]
将MyProject_1
下的stubs
目录复制到MyProject_2
,手动保持同步。缺点是维护开销。
创建名为 MyProject_Stubs
的第三个项目,专门用于保留依赖于 x
的任何项目的存根文件,无论是传递还是直接。缺点是一个专门用于存根的项目。
还有其他我可以考虑的方法吗?对于有点自以为是的部分:这些方法中哪一种似乎具有最大的净优势?
据我所知,无法传递共享存根。
相反,您必须专注于寻找使您的存根对两者可用的方法 projects/making 它是两者的依赖项。
大致有六种不同的方法,我将按照大致递增的顺序列出这些方法。
将你的存根存储在本地计算机的某个位置,并让你的两个项目通过 MYPYPATH 环境变量或配置文件选项引用它。
这样做相对简单,但缺点是您的项目只能在您的本地计算机上运行。如果您计划让其他人使用此项目,他们将需要获取您的存根并设置他们的 MYPYPATH。
将存根复制到第二个项目。正如您所说,这里的主要缺点是您现在需要手动保持存根同步。
为您的存根创建一个单独的 git 存储库,并将它们作为 git submodule 添加到您的两个项目中。
这解决了选项 2 的代码重复问题。唯一真正的缺点是每次更新存根存储库时,您都需要记住在两个项目中修改子模块引脚。
为您的项目提供类型提示 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 之后维护您的存根,那么此选项将是最好的选择。
主要缺点是您无法立即解除封锁。
创建一个包含 py.typed
文件的 X-stubs
包。这有点像你的选项 3,除了你的新项目明确地只用于项目 X 的存根并且是 open-sourced.
然后您可以将 X-stubs
包添加到您的 pip 依赖项中,就像任何 pip 包一样,甚至最终可能会更广泛地研究 open-sourcing 并分发它们。
这与您的选项 3 基本相同,除了您的包的名称不同并且不太特定于您的项目。
向项目 X 提交拉取请求,添加 py.typed 文件以及一些类型提示,并说服他们登陆它。
当然,这说起来容易做起来难 -- 当然,并非所有项目都愿意接受类型提示,因为这可能会增加它们的维护负担。
如果您只关心解除阻塞,我会选择选项 1-3。如果您还想尝试 open-sourcing 您的工作并帮助改善 Python 打字生态系统,那么其他选项更适合。
我会避免你的选项 1 -- 它似乎涉及与我的选项 3 和 5 大致相同的设置工作量,同时还需要在项目 2 中进行更多工作才能使用。
我目前使用的 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.typed
在 package_1
.
问题是 MyProject_2
没有在 stubs/x
接听。由于 x
是 MyProject_2
到 MyProject_1
的传递依赖,我有能力在 MyProject_2
中使用 x
。但是,这没有 stubs/x
.
我可以想象有 3 种方法可以使用这些存根(从而访问 x
的类型提示):
将
MyProject_1
下的stubs
目录添加到MyProject_2
运行宁mypy .
时的MYPYPATH
。缺点是它取决于MyProject_1
是如何通过pip
安装的,并且stubs
必须作为setup.py
.[=49 中的分发包数据的一部分=]将
MyProject_1
下的stubs
目录复制到MyProject_2
,手动保持同步。缺点是维护开销。创建名为
MyProject_Stubs
的第三个项目,专门用于保留依赖于x
的任何项目的存根文件,无论是传递还是直接。缺点是一个专门用于存根的项目。
还有其他我可以考虑的方法吗?对于有点自以为是的部分:这些方法中哪一种似乎具有最大的净优势?
据我所知,无法传递共享存根。
相反,您必须专注于寻找使您的存根对两者可用的方法 projects/making 它是两者的依赖项。
大致有六种不同的方法,我将按照大致递增的顺序列出这些方法。
将你的存根存储在本地计算机的某个位置,并让你的两个项目通过 MYPYPATH 环境变量或配置文件选项引用它。
这样做相对简单,但缺点是您的项目只能在您的本地计算机上运行。如果您计划让其他人使用此项目,他们将需要获取您的存根并设置他们的 MYPYPATH。
将存根复制到第二个项目。正如您所说,这里的主要缺点是您现在需要手动保持存根同步。
为您的存根创建一个单独的 git 存储库,并将它们作为 git submodule 添加到您的两个项目中。
这解决了选项 2 的代码重复问题。唯一真正的缺点是每次更新存根存储库时,您都需要记住在两个项目中修改子模块引脚。
为您的项目提供类型提示 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 之后维护您的存根,那么此选项将是最好的选择。
主要缺点是您无法立即解除封锁。
创建一个包含
py.typed
文件的X-stubs
包。这有点像你的选项 3,除了你的新项目明确地只用于项目 X 的存根并且是 open-sourced.然后您可以将
X-stubs
包添加到您的 pip 依赖项中,就像任何 pip 包一样,甚至最终可能会更广泛地研究 open-sourcing 并分发它们。这与您的选项 3 基本相同,除了您的包的名称不同并且不太特定于您的项目。
向项目 X 提交拉取请求,添加 py.typed 文件以及一些类型提示,并说服他们登陆它。
当然,这说起来容易做起来难 -- 当然,并非所有项目都愿意接受类型提示,因为这可能会增加它们的维护负担。
如果您只关心解除阻塞,我会选择选项 1-3。如果您还想尝试 open-sourcing 您的工作并帮助改善 Python 打字生态系统,那么其他选项更适合。
我会避免你的选项 1 -- 它似乎涉及与我的选项 3 和 5 大致相同的设置工作量,同时还需要在项目 2 中进行更多工作才能使用。