如果我正在制作一个模块,我想在 Python 2 和 Python 3 中运行相同的模块,则有大量选项,包括 six
、 futures
和 2to3
。如果更改的数量很小,那么这些工具中的每一个都有足够的怪癖,我倾向于只为我的模块实际使用的几个不兼容的函数编写一个兼容接口。
一个合理的标准方法是通过简单的版本检查来实现这一点。
import module_bar
if sys.version_info >= (3,):
uniformly_named_foo = module_bar.py3_thing
else:
uniformly_named_foo = module_bar.py2_thing
是否有任何奇怪的情况 sys.version_info
不会被正确报告?在过去,我已经被格式错误的路径、配置、安装、修改等等所困扰,以至于我觉得这不像是我应该信任的东西。
当我们认真对待它时, 我真正关心的是是否实现了特定功能。在 Web 开发中,嗅探用户代理通常被认为是一种不好的做法。相反,人们应该尽最大努力确定某个特定功能是否在使用中。根据功能的不同,可以通过多种方式实现这一目标。
if hasattr(module_bar, 'py3_thing'):
uniformly_named_foo = module_bar.py3_thing
else:
uniformly_named_foo = module_bar.py2_thing
在我的机器上,第二条路线慢了一倍(并不是说额外的几百纳秒对于一次性操作来说真的很重要),但它似乎没有任何其他主要缺点。有优势吗? 是否存在第二种方法会成功而第一种方法会失败的 Python 安装?
原文由 Hans Musgrave 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的。
sys.version_info
是确定 Python 版本的可靠方法。请参阅 Python 3 文档 和 Python 2 文档。
注意:
sys.version_info
是可靠的,但不是sys.version
:如果您担心坏模块会更改
sys.version_info
或其他值,您可以 强制重新加载<module 'sys' (built-in)>
: