Python 是否有使程序包符合PEP-561的最佳实践?

Python 是否有使程序包符合PEP-561的最佳实践?,python,setuptools,mypy,Python,Setuptools,Mypy,我正在编写一个Python项目,它作为一个包发布到类似pypi的存储库中(使用setuptools和twine)。我在代码中使用类型提示 问题是,当从其他项目导入包并运行mypy时,我遇到以下错误: 错误:跳过分析“XXX”:找到模块但没有类型提示或库存根 据我所知,我得到这个错误,因为我的包不符合 在一些在线搜索之后,我没有找到一种非手动的方法将所需文件添加到包中 我求助于编写自己的代码来: 运行stubgen创建存根文件 在每个目录中创建py.typed文件 在setup.py文件的pack

我正在编写一个Python项目,它作为一个包发布到类似pypi的存储库中(使用
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!这就成功了。是否要将其添加为答案?