Создание версительных библиотек в Python

Мы устанавливаем новые филиалы на работе, что все будет делиться теми же библиотеками.

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

Поэтому мы хотели бы верситься наши библиотеки.
То, как я планировал делать это либо подобному

loader.load(name='mylib', version='1.0')

или, может быть, как это:

import mylib
mylib.load(version='1.0')

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

Слегка лучший подход (для ремонтопригодности) состоит в том, чтобы иметь все версии библиотеки в том же файле и вызывать некоторую функцию нагрузки, которая создает ссылки на функции. Я не знаю, насколько это будет хорошо (мы могли бы в конечном итоге с файлом Monster из нескольких тысяч строк, которые могли бы, конечно, удалить старые, неиспользуемые версии).

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

Есть ли что-то подобное, встроенное в Python или любой другой подход, который будет работать?

У кого-нибудь есть опыт такого рода вещей?


Я могу добавить, что вещи, которые используют Libs Просто хочу тестера к CD в ветку и запустить ./testit.py, ничего больше.


Решение

Решение основано на предложении Гринго Сувели.

class MyClass_1_0:
    def func1(self):
        return 'Baz'

    def func2(self):
        return 'Bar'

class MyClass_1_1(MyClass_1_0):
    # Overwriting a function:
    def func1(self):
        return 'Foo'

    # Definining a new function which uses a function
    # from a previous version:
    def func3(self):
        print("{} {}".format(self.func1(), self.func2()))

# Change this to the latest version for stuff that always wants the latest
class MyClass(MyClass_1_1): pass

Пример использования:

>>> from my.module import MyClass_1_1 as MyClass
>>> m = MyClass()
>>> m.func3()
Foo Bar
6
задан Nicklas A. 1 September 2011 в 20:31
поделиться