Создание библиотек с версиями в python

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

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

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

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

, либо, возможно, так:

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

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

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

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

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

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


Я могу добавить, что вещи, которые используют libs, являются тестовыми случаями, мы просто хотим, чтобы тестер в ветвь и запустить ./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
-121--1646956- Почему последовательности юникода Python требуют специальной обработки для UTF-8 спецификации? По какой-то причине Python, похоже, имеет проблемы с спецификацией при чтении последовательностей юникода из файла UTF-8. Рассмотрим следующее: с открытым ('test.py') в качестве f: для строки в f: print unicode (...

По какой-то причине в Python возникают проблемы с BOM при чтении последовательностей Юникода из файла UTF-8 . Рассмотрим следующее:

with open('test.py') as f:
   for line in f:
      print unicode(line, 'utf-8')

Кажется простым, не так ли?

Это то, о чем я думал, пока не запустил его из командной строки и не получил:

UnicaseEncodeError: 'charmap' кодек не может кодировать символ u '\ufeff' в позиции 0: символьные карты на < undefined >

Краткое посещение Google показало, что спецификация должна быть очищена вручную :

import codecs
with open('test.py') as f:
   for line in f:
      print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')

. Однако я изо всех сил пытаюсь увидеть в этом какие-либо заслуги.

Есть ли обоснование вышеописанному поведению? Напротив, UTF-16 работает безупречно.

14
задан tchrist 4 April 2015 в 18:16
поделиться