Python 是否有使程序包符合PEP-561的最佳实践?
我正在编写一个Python项目,它作为一个包发布到类似pypi的存储库中(使用Python 是否有使程序包符合PEP-561的最佳实践?,python,setuptools,mypy,Python,Setuptools,Mypy,我正在编写一个Python项目,它作为一个包发布到类似pypi的存储库中(使用setuptools和twine)。我在代码中使用类型提示 问题是,当从其他项目导入包并运行mypy时,我遇到以下错误: 错误:跳过分析“XXX”:找到模块但没有类型提示或库存根 据我所知,我得到这个错误,因为我的包不符合 在一些在线搜索之后,我没有找到一种非手动的方法将所需文件添加到包中 我求助于编写自己的代码来: 运行stubgen创建存根文件 在每个目录中创建py.typed文件 在setup.py文件的pack
setuptools
和twine
)。我在代码中使用类型提示
问题是,当从其他项目导入包并运行mypy
时,我遇到以下错误:
错误:跳过分析“XXX”:找到模块但没有类型提示或库存根
据我所知,我得到这个错误,因为我的包不符合
在一些在线搜索之后,我没有找到一种非手动的方法将所需文件添加到包中
我求助于编写自己的代码来:
stubgen
创建存根文件py.typed
文件setup.py
文件的package\u data
字段中的dict
中收集所有创建的文件这段代码解决了这个问题,
mypy
运行时没有错误。但我觉得这很不对。是否有一个标准工具使程序包符合PEP-561?我还遗漏了什么吗?解决方案是在主包的根目录中添加一个py.typed
文件。这将迫使mypy分析类型。如前所述,您需要在模块的包文件夹中添加py.typed
。
您还需要将该文件添加到-否则,在部署该文件时,该文件将不是包的一部分
我个人将类型注释放在代码中,不创建额外的存根文件——但这只能从python 3.4以上版本中实现。如果您想使python2.7兼容代码,就不能使用内联类型注释——在这种情况下,您可以使用存根文件
如果要为第三方库键入注释,可以为该库使用的函数编写*.pyi文件。这可能有点棘手,因为MYPY必须在MYPY路径中只找到一次*.pyi文件
所以我是这样处理的:
对于本地测试,MYPY路径设置为我收集所有第三方存根的目录,
对于travis上的测试,我在包中有一个子目录,其中包含该模块在travis上测试所需的存根,并相应地设置mypy路径。您是否尝试跳过步骤1并简化步骤3,以便在
包数据
字段中只包含py.typed
文件?如果有一个py.typed
文件而没有存根文件,那么像mypy这样的类型检查器应该直接分析源代码以获取类型提示。这是一个很好的优化,但最终我还是要编写自定义代码。另外,生成存根是很容易的,因为有一个工具可以实现这一点。我认为您不需要编写任何自定义代码?您应该只需要在顶级软件包中创建一个py.typed
文件,并调整setup.py
文件一次,以硬编码新文件的路径。顶级包中存在py.typed
文件意味着所有子包都必须由类型检查器进行分析。仔细看一下第二步,您现在做的似乎是在每个目录中添加一个py.typed
文件?如果是这样,那就没必要了。。我会试着回电谢谢@Michael0x2a!这就成功了。是否要将其添加为答案?