如果您的代码不是过度依赖于异常处理程序中的运行时性能,那么您甚至可以在没有为Py3单独设置分支的情况下逃脱。我设法为我所有的Py2.x版本保留了一个pyparsing版本,尽管我不得不坚持使用“最小公分母”方法,这意味着我必须放弃使用一些结构,比如生成器表达式,以及上下文管理器。我用dicts代替set,所有的生成器表达式都被包装成列表理解,所以它们仍然可以回到python2.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中引入的用于捕捉异常的不兼容语法,从
^{pr2}$
到except exceptionType as varname:
当然,如果不需要异常变量,可以写下:except exceptionType:
这对Py2或Py3有效。但如果您需要访问异常,您仍然可以使用跨版本兼容语法:except exceptionType:
exceptionvar = sys.exc_info()[1]
这有一个较小的运行时代价,这使得它在pyparsing的某些地方不可用,所以我仍然需要维护单独的Py2和Py3版本。对于源代码合并,我使用了实用程序WinMerge,我发现它非常适合保持源代码目录的同步。在
因此,即使我保留了两个版本的代码,这些统一技术中的一些帮助我将差异降低到绝对不兼容的最小值。在