私信  •  关注

Peter Hansen

Peter Hansen 最近创建的主题
Peter Hansen 最近回复了
14 年前
回复了 Peter Hansen 创建的主题 » 支持不同版本的python

如果版本之间的差异不是极端的,您可以尝试将它们隔离到一个单独的包或模块中,在这个包或模块中您可以编写特定于版本的代码来充当适配层。

以一种简单的方式,在简单的情况下,这可以在不使用单独模块的情况下完成,例如当一个新版本的python使standard成为一个曾经是外部的包时,例如(例如)simplejson。我们在一些代码中有类似的东西:

try:
    import simplejson as json
except ImportError:
    import json

对于一些不重要的东西,比如你可能拥有的东西,你不会希望这些东西随机地散布在你的代码库中,所以你应该尽可能把它们收集在一个地方,并使之成为你的代码中唯一一个版本特定的部分。

对于语法不同的情况,比如您对希望使用上下文管理器的评论,这样做效果不太好。当然,您可以将上下文管理器代码放在一个单独的模块中,但这可能会使您使用它的地方复杂化。在这种情况下,您可以将某些关键特性(我认为上下文管理器可以很容易地模拟)移植到此适配器模块。

当然,拥有独立的代码库是你能做的最糟糕的事情,所以我当然建议你不要那样做。至少,不要随意使用较新版本的python中的特性,因为尽管将它们放在代码中看起来很不错(可能会简化特定的逻辑块),但必须通过分叉代码基(即使是在单个模块上)来复制该逻辑,这一事实将使韩寒否定了这些好处。

我们坚持使用旧版本的遗留代码,在新版本发布时进行调整以支持旧版本,但保持对旧版本的支持,有时使用小的适配器层。在某个时刻,我们的代码的一个主要版本出现在计划中,我们考虑是否是时候放弃对旧python的支持了。当这种情况发生时,我们试着跳过几个版本,直接从2.4升级到2.6,然后才真正开始利用新的语法和不适应性的特性。