Python:在应用程序中包含版本号的最佳实践?

时间:2010-12-26 23:43:24

标签: python version global-variables

我有一个可以读写数据文件的PyQt应用程序。我在每个文件中都包含一个“版本号”。这是一个类似于以下的简单数字:1.2或其他(主要版本和次要版本)。

我正在这样做,以便我可以在将来的版本中更改这些数据文件的格式,然后只需检查文件中的版本是否正确解析它们。

我的问题是保持这个数字存储在应用程序本身内的最佳做法是什么。即我只是将应用版本号硬编码到负责读取和写入文件的类中吗?或者我应该在应用程序的顶层存储某种对象/变量,并以某种方式从负责读取和写入这些文件的类中访问它。如果是后者,我该如何存储它以及如何访问它?

感谢。

3 个答案:

答案 0 :(得分:4)

首先,将数据格式与应用程序分开进行版本,如果尚未这样做的话。其次,为较新版本的格式提供单独的类。如果格式完全向后兼容,则可以删除旧版本的类。至于文件结构,你可以有类似的东西:

      
  • DF     
            
    • __初始化__。PY
    •       
    • dfbase.py
    •       
    • V1_1         
                  
      • __初始化__。PY
      •           
      • format.py
      •         
            
    •       
    • V2_0         
                  
      • __初始化__。PY
      •           
      • format.py
      •         
            
    •     
      

其中“df”代表数据格式名称。包初始化文件导入适当的包并定义结构或函数以使其可访问。顶级__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 / format.py:

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.
    """
    ...

答案 1 :(得分:1)

许多开源项目(例如numpy,fabric)都有一个名为“version”的模块,其中包含顶级变量中的版本信息。参见例如fabric's version file

答案 2 :(得分:0)

就个人而言,我不会这样手动。我将我的代码保存在Subversion中,并让它为我保留修订号。