如果您的代码没有过度依赖异常处理程序中的运行时性能,您甚至可以在没有单独的 Py3 分支的情况下侥幸逃脱。我已经设法为我的所有 Py2.x 版本保留一个 pyparsing 版本,尽管我不得不坚持使用“最低公分母”方法,这意味着我必须放弃使用生成器表达式等一些构造,并且你的观点,上下文管理器。我使用 dicts 代替集合,并且我的所有生成器表达式都被包装为列表推导,因此它们仍然可以追溯到 Python 2.3。我的代码顶部有一个块,用于处理许多 2vs3 问题(由 pyparsing 用户 Robert A Clark 提供):
_PY3K = sys.version_info[0] > 2
if _PY3K:
_MAX_INT = sys.maxsize
basestring = str
unichr = chr
unicode = str
_str2dict = set
alphas = string.ascii_lowercase + string.ascii_uppercase
else:
_MAX_INT = sys.maxint
range = xrange
def _str2dict(strg):
return dict( [(c,0) for c in strg] )
alphas = string.lowercase + string.uppercase
我遇到的最大困难是捕获异常的不兼容语法,它是在 Py3 中引入的,从
except exceptiontype,varname:
至
except exceptionType as varname:
当然,如果你真的不需要异常变量,你可以写:
except exceptionType:
这将适用于 Py2 或 Py3。但是如果你需要访问异常,你仍然可以想出一个跨版本兼容的语法:
except exceptionType:
exceptionvar = sys.exc_info()[1]
这有轻微的运行时损失,这使得它在 pyparsing 的某些地方无法使用,所以我仍然必须维护单独的 Py2 和 Py3 版本。对于源合并,我使用实用程序WinMerge,我发现它非常适合保持源代码目录的同步。
因此,即使我保留了两个版本的代码,其中一些统一技术也可以帮助我将差异降低到绝对不兼容的最小值。