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

5 投票
3 回答
5325 浏览
提问于 2025-04-16 09:04

我有一个用PyQt做的应用程序,它可以读取和写入数据文件。我在每个写入的文件中都包含一个“版本号”。这个版本号就是一个简单的数字,比如:1.2,表示主要版本和次要版本。

我这样做是为了将来如果我需要改变这些数据文件的格式,仍然可以通过检查文件里的版本号来正确解析它们。

我想问的是,如何在应用程序内部保存这个版本号才是最佳做法。也就是说,我是直接把应用程序的版本号写死在负责读取和写入文件的类里呢?还是应该在应用程序的顶层有一个对象或变量,然后从负责读取和写入文件的类中访问它。如果是后者,我该如何存储它,怎么访问呢?

谢谢。

3 个回答

1

我个人觉得不应该这样手动操作。我会把我的代码保存在Subversion里,让它帮我管理版本号。

4

很多开源项目(比如numpy、fabric)都有一个叫做“version”的模块,这个模块里面存放着版本信息,通常是一些顶层的变量。你可以看看,比如说fabric的版本文件

4

首先,要把数据格式的版本管理和应用程序分开,如果你还没有这样做的话。其次,为数据格式的不同版本创建独立的类。如果新的格式完全向后兼容,你可以不再保留旧版本的类。至于文件结构,你可以像这样组织:

  • DF
    • __init__.py
    • dfbase.py
    • v1_1
      • __init__.py
      • format.py
    • v2_0
      • __init__.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.
    """
    ...

撰写回答