Если ваш код не слишком зависит от производительности во время выполнения в обработчиках исключений, вы даже можете уйти без отдельной ветви для Py3. Мне удалось сохранить одну версию pyparsing для всех моих версий Py2.x, хотя мне пришлось придерживаться подхода «самый низкий общий знаменатель», что означает, что я должен отказаться от использования некоторых конструкций, таких как выражения генератора, и вашей точки, менеджеров контекста. Я использую 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, которую я нахожу очень хорошо для синхронизации каталогов исходного кода.
Таким образом, хотя я сохраняю две версии моего кода, некоторые из этих методов унификации помогают мне сохранить различия до абсолютного несовместимого минимума.
Это означало бы, что я не смогу использовать идиомы из Python 2.6, которые сосут. Например, я люблю использовать контекстные менеджеры. –
Мое мнение заключалось в том, что вы пишете версию с помощью менеджера контекста. то вы переписываете его на 2.4. версия 2.4 будет по-прежнему работать в версии 2.6, чтобы вы дублировали некоторые усилия. Ничто не мешает вам поддерживать 4 филиала, но у вас будет много слияния. Возможно, есть «общий» каталог для кода, который одинаковый для всех. Я не думаю, что есть какие-то волшебные пикси, которые делают все слияние для вас, но –
Я в порядке с выполнением всех слияний, если я могу работать с менеджером контекста на моей копии 2.6. –