解析复杂的基于字符串的配置选项

问题描述

我正在尝试构建一个 Python 程序,该程序将解析来自 Universe 数据库的转换代码。这些转换代码是编码大量信息的高度密集的字符串,我正在努力开始。转换代码的不同排列可能有数十万种(虽然我没有计算过)。

我对 argparse 很熟悉,但是我无法想出一种使用 argparse 处理这种解析的方法,而且我的 Google-fu 还没有想出任何其他方法解决方案。

最初,我懒惰的工作只是对最常见的转换代码进行字典查找,但是现在我们使用这个 Python 程序来获取更多数据,维护每个单独的转换代码变得非常繁琐。

例如,日期转换代码可能采用以下形式:

  • 日期:D[n][*m][s][fmt[[f1,f2,f3,f4,f5]]][E][L],例如D2/D4-2/RM
  • 日期时间:DT[4|D|4D|T|TS|Z][;timezone],例如DTZDT4;America/Denver
  • 日期时间 ISO:DTI[B][R|W][S][Z][2|1|0][;[timezone|offset]],例如DTIBZ2DTIR;America/Denver

还有一堆其他的转换代码,参数同样复杂。

我的最终目标是能够将 Universe 的字符串数据转换为适当的 Python 对象并再次返回,为此,我需要了解这些转换代码

如果有帮助,我不需要验证这些转换代码。一旦它们被设置在数据库中,它们就会在那里得到验证。

解决方法

我建议您使用 readnamedfields/writenamedfields 方法,这将返回 OCNV 数据,当您回写时,它会处理 ICONV。

导入u2py 帮助(u2py.File.readnamedfields) u2py 模块中函数 readnamedfields 的帮助:

readnamedfields(self,*args) F.readnamedfields(recordid,fieldnnames,[lockflag]) -> new DynArray 对象——按文件中记录的名称读取指定字段

fieldnames is a u2py.DynArray object with each of its fields being a name defined in the dictionary file
lockflag is either 0 (default),or [LOCK_EXCLUSIVE or LOCK_SHARED] [ + LOCK_WAIT]

note: if fieldnames contains names that are not defined in the dictionary,these names are replaced by @ID and no exception is raised