Если ваш код не слишком зависит от производительности во время выполнения в обработчиках исключений, вы можете даже обойтись без отдельной ветки для Py3. Мне удалось сохранить одну версию pyparsing для всех моих версий Py2.x, хотя мне пришлось придерживаться подхода «наименьшего общего знаменателя», что означает, что я должен отказаться от использования некоторых конструкций, таких как выражения генератора, и ваша точка зрения, менеджеры контекста. Я использую dicts вместо наборов, и все мои генераторные выражения обёрнуты как списки, так что они всё ещё будут работать, начиная с Python 2.3. У меня есть блок в верхней части моего кода, который решает ряд проблем 2 на 3 (внесенный пользователем pyparsing Робертом Кларком):
_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:
to
except exceptionType as varname:
Конечно, если вам действительно не нужна переменная исключения, вы можете просто написать:
except exceptionType:
и это будет работать на Py2 или Py3. Но если вам нужно получить доступ к исключению, вы все равно можете придумать синтаксис, совместимый с кросс-версиями, например:
except exceptionType:
exceptionvar = sys.exc_info()[1]
Это имеет незначительный штраф во время выполнения, что делает его непригодным для использования в некоторых местах при pyparsing, поэтому мне все еще приходится поддерживать отдельные версии Py2 и Py3. Для слияния исходного кода я использую утилиту WinMerge, которая, по моему мнению, очень удобна для синхронизации каталогов исходного кода.
Так что, хотя я храню две версии своего кода, некоторые из этих методов унификации помогают мне свести различия к абсолютному минимуму несовместимости.
person
PaulMcG
schedule
10.10.2009