Если ваш код не слишком зависит от производительности во время выполнения в обработчиках исключений, вы можете даже обойтись без отдельной ветки для Py3. Мне удалось сохранить одну версию pyparsing для всех моих версий Py2.x, хотя мне пришлось придерживаться подхода «наименьшего общего знаменателя», что означает, что я должен отказаться от использования некоторых конструкций, таких как выражения генератора, и Ваша точка зрения, контекстные менеджеры. Вместо наборов я использую dicts, и все мои выражения генератора переносятся в списки, поэтому они по-прежнему будут работать, возвращаясь к Python 2.3. У меня есть блок в верхней части моего кода, который решает ряд проблем 2х3 (предоставлен пользователем с разбором Робертом Кларком):
_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]
Это незначительное наказание во время выполнения, что делает его непригодным для использования в некоторых местах при разборе, поэтому мне все еще приходится поддерживать отдельные версии Py2 и Py3. Для слияния исходного кода я использую утилиту WinMerge , которая мне очень подходит для синхронизации каталогов исходного кода.
Таким образом, даже несмотря на то, что я сохраняю две версии своего кода, некоторые из этих методов унификации помогают мне сократить различия до абсолютного несовместимого минимума.