Поддержка нескольких версий модуля Python (с одной и той же версией Python)

Я посмотрел вокруг, но не нашел четкого ответа на свой вопрос.

У меня есть вполне законная потребность в поддержке N-версий одного и того же модуля Python.

Если они хранятся в одном и том же пакете/каталоге, они должны иметь уникальное имя, как в следующем примере:

      .../some/package/my_module_1.0.py
      .../some/package/my_module_1.1.py
      .../some/package/my_module_2.0.py
              -- etc. --

И каждый, в свою очередь, будет хранить свой номер версии с помощью атрибута "version".

Затем программа-потребитель импортирует нужную версию (например: import my_module_1.1).

Является ли это оптимальным (и наиболее питоническим) способом выполнения этой многомодульной версии?

Спасибо!


person NYCeyes    schedule 15.03.2016    source источник
comment
Было бы хорошо, если бы вы просто сделали модуль совместимым с обеими версиями.   -  person zondo    schedule 15.03.2016
comment
Спасибо. Я не уверен, что понимаю, что вы имеете в виду. Можете ли вы уточнить? Кроме того, помните, что может быть много версий, а не только две (есть причина - это связано с конвейером ETL, но я не буду утомлять всех). :)   -  person NYCeyes    schedule 15.03.2016
comment
Я не могу сказать, что это обязательно возможно сделать, потому что я не вижу кода, но если вы написали my_module_*, вы могли бы сохранить синтаксис, совместимый с более чем одной версией. Например, except Exception, e: является допустимым синтаксисом в Python2, но не в Python3, поэтому вам следует использовать except Exception as e:, поскольку он допустим в обеих версиях.   -  person zondo    schedule 15.03.2016
comment
О, Боже. Нет, я не имею в виду модуль, который требует работы с разными интерпретаторами Python (например, Python 2 и 3). Я имею в виду просто несколько версий одного и того же модуля (скажем, только в Python3 для простоты).   -  person NYCeyes    schedule 15.03.2016
comment
Знает ли потребляющая программа, какая версия ей нужна? В этом случае он просто выбирает правильный импорт с помощью последовательности операторов if:else:. Вы также можете заглянуть в sys.__modules__, который содержит словарь импортированных модулей с ключами по имени, обычно по имени файла. Возможно, вы сможете скрыть проблему управления версиями, импортировав правильный модуль и всегда сохраняя его под одним и тем же ключом, независимо от фактического имени файла.   -  person Paul Cornelius    schedule 15.03.2016
comment
Попробуйте поискать в Google поддержку нескольких версий API для отдыха для django/flask — это похоже на вашу проблему.   -  person willnx    schedule 15.03.2016
comment
Да, программа получит объект конфигурации, полученный с помощью ConfigParser и файла ini (так что она будет знать точную версию). И ему нужно будет использовать именно эту предоставленную версию (или вручную создать исключение, если оно недоступно). Он не может сделать что-то вроде использования последней версии; затем следующая последняя версия, если она недоступна, и так далее. На самом деле, я искал наилучшую структуру каталогов. Возможно, того, что я написал в вопросе, будет достаточно. Но открыты для идей. Я посмотрю на sys._modules__. Спасибо.   -  person NYCeyes    schedule 15.03.2016


Ответы (1)


Я погуглил, чтобы узнать, что "flask поддерживает несколько версий API", и нашел это сообщение stackoverflow будет очень удобным.

Короче говоря, единственное реальное различие, предложенное в этом посте по сравнению с тем, что вы предоставили, заключается в том, что они используют подкаталоги для каждой версии, а каждая версия сама по себе является модулем.

Если вы можете/разрешите использовать общие функции/объекты между версиями, эта структура может упростить обслуживание/управление вашим модулем.

some_package
+--- my_module/
     +--- v1_0/
          +--- __init__.py
          +--- some_file.py
     +--- v2_0/
          +--- __init__.py
          +--- some_file.py
     +--- __init__.py
     +--- common_stuff.py

Но если вы не можете делиться вещами между версиями, тогда ваша текущая идея отлично работает и проще.

И тогда вы можете импортировать его следующим образом:

import my_module.vX_Y as my_module
person willnx    schedule 15.03.2016
comment
Спасибо @willnx. Я видел ваше примечание выше. Позвольте мне подумать/время. Если я не могу найти что-то лучше (не то, чтобы ваш ответ был плохим), я отмечу это как ответ. Хотя я уже проголосовал. знак равно Спасибо, - person NYCeyes; 15.03.2016
comment
Спасибо за включение моих предложенных правок и исправлений в ваш ответ. Я выбираю его в качестве ответа. - person NYCeyes; 15.03.2016