【发布时间】:2019-02-20 21:50:13
【问题描述】:
如果我要创建一个模块,我希望在 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 安装?
【问题讨论】:
-
是的。为什么不呢?
-
@iBug “为什么不”源于我不知道我在这里不知道什么。问题(这里)[stackoverflow.com/questions/22236727/…表示可能有问题。
-
@Hans 查看文档:不要从中提取版本信息 (
sys.version),而是使用version_info和平台模块提供的功能. 查看我编辑的答案。
标签: python python-3.x python-2.7