是否有使带有类型注释的 Python 3.5 代码向后兼容的策略?
Is there a strategy for making Python 3.5 code with type-annotations backwards compatible?
我想在我的开源库中支持新的 Python 功能。 Python 的新类型提示使用户更容易使用我的软件。
但它有一个障碍 - 它依赖于一个名为 typing
的库来提供一些更有趣的类型注释。 Python < 3.5 中不存在该库。
通常我会使用兼容性库(例如 six
)处理该问题,但是 six
中尚不支持 typing
模块。
另一个可接受的解决方案可能是 3to2
转换器,它可以去除不支持的功能。不幸的是,我还没有看到 3.5 到 3.(x<5) 的转换器。
似乎现在唯一可用的替代方法是将我所有的 typedef 导入包装到 try 块中,并为该语言的旧版本提供一个伪造的 typedef。这很丑陋,而且不是我想要的项目处理方式。
有什么建议吗?
Python3.5 中的类型提示由两部分组成:
- 类型提示对象库,名为
typing
- 注释语法
两者都可以在早期的 Python 版本中使用,或者可以在尚不支持注释语法的情况下使用。
模块已 backported to Python 3.2 and newer. Annotations have been supported by all Python 3 versions, right from 3.0 onwards, see PEP 3107。这意味着类型提示代码可以适用于所有广泛使用的 Python 3 发行版。
对于Python2.x,可以用stub files代替;这些实际上并没有执行,只有静态分析工具需要能够解析这些。对于这些,您仍然 'import' typing
模块,但该模块从未真正加载,也不需要为存根文件安装。存根文件具有 .pyi
扩展名并且位于 .py
对应文件旁边,但包含完整注释,但没有函数体(您应该使用 ...
省略号文字)。
您可以查看 Mypy stub specifications 以了解这在实践中的工作方式; Python 类型提示 PEP 很大程度上受到了 Mypy 等工具的启发。
我想在我的开源库中支持新的 Python 功能。 Python 的新类型提示使用户更容易使用我的软件。
但它有一个障碍 - 它依赖于一个名为 typing
的库来提供一些更有趣的类型注释。 Python < 3.5 中不存在该库。
通常我会使用兼容性库(例如 six
)处理该问题,但是 six
中尚不支持 typing
模块。
另一个可接受的解决方案可能是 3to2
转换器,它可以去除不支持的功能。不幸的是,我还没有看到 3.5 到 3.(x<5) 的转换器。
似乎现在唯一可用的替代方法是将我所有的 typedef 导入包装到 try 块中,并为该语言的旧版本提供一个伪造的 typedef。这很丑陋,而且不是我想要的项目处理方式。
有什么建议吗?
Python3.5 中的类型提示由两部分组成:
- 类型提示对象库,名为
typing
- 注释语法
两者都可以在早期的 Python 版本中使用,或者可以在尚不支持注释语法的情况下使用。
模块已 backported to Python 3.2 and newer. Annotations have been supported by all Python 3 versions, right from 3.0 onwards, see PEP 3107。这意味着类型提示代码可以适用于所有广泛使用的 Python 3 发行版。
对于Python2.x,可以用stub files代替;这些实际上并没有执行,只有静态分析工具需要能够解析这些。对于这些,您仍然 'import' typing
模块,但该模块从未真正加载,也不需要为存根文件安装。存根文件具有 .pyi
扩展名并且位于 .py
对应文件旁边,但包含完整注释,但没有函数体(您应该使用 ...
省略号文字)。
您可以查看 Mypy stub specifications 以了解这在实践中的工作方式; Python 类型提示 PEP 很大程度上受到了 Mypy 等工具的启发。