Python:在应用中包含版本号的最佳实践?
我有一个用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.
"""
...