2010-12-26 1 views
4

У меня есть приложение PyQt, которое читает и записывает файлы данных. В каждый файл записывается «номер версии». Это простое число, похожее на: 1.2 или что-то (основные и второстепенные версии).Python: Лучшая практика для включения номера версии в приложение?

Я делаю это, чтобы изменить формат этих файлов данных в будущих версиях, а затем все еще правильно разобрать их, просто проверив, что версия находится внутри файла.

Мой вопрос заключается в том, что лучше всего хранить этот номер, хранящийся внутри самого приложения. То есть я просто скорректирую номер версии приложения в класс, который отвечает за чтение и запись файлов? Или я должен иметь какой-то объект/переменную, хранящуюся на верхнем уровне приложения, и каким-то образом получить к нему доступ из класса, ответственного за чтение и запись этих файлов. Если последний, как я его храню и как мне получить к нему доступ?

Спасибо.

ответ

0

Лично я не сделал бы это вручную таким образом. Я бы сохранил свой код в Subversion и позволю ему сохранить номера версий для меня.

1

Многие проекты с открытым исходным кодом (например, numpy, fabric) имеют модуль под названием «версия», который содержит информацию о версии в переменных верхнего уровня. См. fabric's version file.

1

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

  • DF
    • __init__.py
    • dfbase.py
    • v1_1
      • __init__.py
      • format.py
    • v2_0
      • __init__.py
      • format.py

где "ДФ" обозначает имя формата данных. Файлы инициализации пакета импортируют соответствующие пакеты и определяют структуру или функцию, чтобы сделать их доступными. Верхний уровень __init__.py также должен определять фабричную функцию для создания объектов формата данных, поэтому вам не нужно.

DF/__ init__.py:

from df.dfbase import DFBase 
from v1_1 import DF as DF1 
from v2_0 import DF as DF2 
versions = { 
    '1.0': DF1, # let's say minor versions are fully backwards compatible 
    '1.1': DF1, 
    '2.0': DF2 
} 
def create(file): 
    """Factory function. Loads data from 'file', returns a DF of the appropriate 
    version. 
    """ 
    ... 

DF/v1_1/__ init__.py:

__version__ = '1.1' 
# previous versions that this one is backwards compatible with 
previous = ['1.0'] 
from format import DF 

DF/v1_1/формат.ру:

from df import DFBase 

class DF(DFBase): 
    ... 

DF/v2_0/__ init__.py:

__version__ = '2.0' 
from format import DF 

С немного больше кодирования в DF/__ init__.py, вы можете автоматизировать импорт и регистрацию версий формата.

import glob, sys 
from ndf.ndfbase import NDFBase 

formats={} 

for ver in glob.iglob('v*_*'): 
    pkg = '{0}.{1}'.format(__package__, ver) 
    __import__(pkg) 
    formats[sys.modules[pkg].__version__] = sys.modules[pkg] 
    if hasattr(sys.modules[pkg], 'previous'): 
     for prev in sys.modules[pkg].previous: 
      formats[prev] = sys.modules[pkg] 

def create(file): 
    """Factory function. Loads data from 'file', returns a DF of the appropriate 
    version. 
    """ 
    ... 
+0

очень хороший подход – sipiatti

 Смежные вопросы

  • Нет связанных вопросов^_^