我们有相关的问题,一个同时支持 jython 和 cpython 的大型系统回到 2.4。基本上,您需要将需要以不同方式编写的代码隔离到一组希望很小的模块中,并有条件地导入内容。
# module svn.py
import sys
if sys.platform.startswith('java'):
from jythonsvn import *
else:
from nativesvn import *
在您的示例中,您可能会使用针对 sys.version_info 的测试。您可以在实用程序模块中定义一些简单的东西,您可以使用: from util import *
# module util.py
import sys
if sys.exc_info[0] == 2:
if sys.exc_info[1] == 4:
from util_py4 import *
...
然后 util_py4.py 中的内容如下:
def any(seq): # define workaround functions where possible
for a in seq:
if a: return True
return False
...
虽然这是与移植不同的问题(因为您想继续支持),但此链接提供了一些有用的指导http://python3porting.com/preparing.html(与移植 python 2.x 的各种其他文章一样) .
不过,您关于没有上下文管理器就无法生存的评论有点令人困惑。虽然上下文管理器功能强大并且使代码更具可读性并最大限度地减少错误风险,但您将无法在 2.4 版本的代码中使用它们。
### 2.5 (with appropriate future import) and later
with open('foo','rb')as myfile:
# do something with myfile
### 2.4 and earlier
myfile = None
try:
myfile = open('foo','rb')
# do something with myfile
finally:
if myfile: myfile.close()
由于您想支持 2.4,因此您将拥有一段代码,它只需要具有第二种语法。两种方式都写真的会更优雅吗?