是否有使包符合 PEP-561 标准的最佳实践?
Is there a best practice to make a package PEP-561 compliant?
我正在编写一个 Python 项目,该项目作为一个包发布到类似 pypi 的存储库(使用 setuptools
和 twine
)。我在我的代码中使用类型提示。
问题是,当从不同的项目和 运行 mypy
导入包时,出现以下错误:
error: Skipping analyzing 'XXX': found module but no type hints or library stubs
据我所知,我收到此错误是因为我的包裹不符合 https://www.python.org/dev/peps/pep-0561/。
在网上搜索了一番,没有找到非手动添加所需文件的方法。
我将自己的代码写到:
- 运行
stubgen
创建存根文件。
- 在每个目录中创建
py.typed
个文件。
- 在
setup.py
文件的 package_data
字段中的 dict
中收集所有创建的文件。
此代码解决了问题,mypy
运行没有错误。但这对我来说感觉很不对。是否有标准工具可以使包符合 PEP-561 标准?我还漏掉了什么吗?
解决方案是将一个 py.typed
文件添加到主包的根目录。这会强制 mypy 分析类型。
如前所述,您需要在模块的包文件夹中添加py.typed
。
您还需要将该文件添加到 setup.py package_data - 否则该文件在部署时不会成为包的一部分。
我个人将类型注释放在代码中并且不创建额外的存根文件 - 但只有从 python 3.4 向上才有可能。如果你想制作 python2.7 兼容代码,你不能使用内联类型注释 - 在这种情况下你可以使用存根文件。
如果您想对第三方库进行类型注释,您可以为您用于该库的函数编写一个 *.pyi 文件。这可能有点棘手,因为 MYPY 只能在 MYPY 路径中找到 *.pyi 文件一次。
所以我就是这样处理的:
对于本地测试,MYPY 路径设置为我收集所有第 3 方存根的目录,
为了在 travis 上进行测试,我在包中有一个子目录,其中包含该模块在 travis 上进行测试所需的存根,并相应地设置 mypy 路径。
我正在编写一个 Python 项目,该项目作为一个包发布到类似 pypi 的存储库(使用 setuptools
和 twine
)。我在我的代码中使用类型提示。
问题是,当从不同的项目和 运行 mypy
导入包时,出现以下错误:
error: Skipping analyzing 'XXX': found module but no type hints or library stubs
据我所知,我收到此错误是因为我的包裹不符合 https://www.python.org/dev/peps/pep-0561/。
在网上搜索了一番,没有找到非手动添加所需文件的方法。
我将自己的代码写到:
- 运行
stubgen
创建存根文件。 - 在每个目录中创建
py.typed
个文件。 - 在
setup.py
文件的package_data
字段中的dict
中收集所有创建的文件。
此代码解决了问题,mypy
运行没有错误。但这对我来说感觉很不对。是否有标准工具可以使包符合 PEP-561 标准?我还漏掉了什么吗?
解决方案是将一个 py.typed
文件添加到主包的根目录。这会强制 mypy 分析类型。
如前所述,您需要在模块的包文件夹中添加py.typed
。
您还需要将该文件添加到 setup.py package_data - 否则该文件在部署时不会成为包的一部分。
我个人将类型注释放在代码中并且不创建额外的存根文件 - 但只有从 python 3.4 向上才有可能。如果你想制作 python2.7 兼容代码,你不能使用内联类型注释 - 在这种情况下你可以使用存根文件。
如果您想对第三方库进行类型注释,您可以为您用于该库的函数编写一个 *.pyi 文件。这可能有点棘手,因为 MYPY 只能在 MYPY 路径中找到 *.pyi 文件一次。
所以我就是这样处理的:
对于本地测试,MYPY 路径设置为我收集所有第 3 方存根的目录, 为了在 travis 上进行测试,我在包中有一个子目录,其中包含该模块在 travis 上进行测试所需的存根,并相应地设置 mypy 路径。