私は ConfigObj を見てきましたが、検証と単一要素リストで問題が発生しました。次のような構成仕様があるとします。
config_specification = """[Data]
[[__many__]]
type = option('sense.xml')
transport = string
sensors = list
[[[Identifier]]]
type = option("name", "mac", "uuid")
adapter = string(default='')
name = string(default='')
file = string(default='')"""
このリストは、実際には 1 つまたは複数の要素にすることができます。私は簡単に複数のことを行うことができます:
[Data]
[[primary]]
type = sense.xml
transport = $http
sensors = $virtual, $gpio, $adc
[[[Identifier]]]
type = name
name = VirtualRelay01
ただし、以下は無効です。それは1のリストに変換されません:
sensors = $virtual
いくつかのバリエーションを試しました。これは機能しません
sensors = {$virtual}
これもそうではありません:
sensors = [$virtual]
これを行うと、2 つの要素を持つリストが得られます。空の文字列の 1 つ:
sensors = ($virtual,)
これらのセクションがいくつかあり、それらを for ループに入れています。リストのみを受け取るクラスにそれらを適用しますが、それらの周りにリストを追加するためにすべての特殊なケースを個別にコーディングする必要はありません (言うまでもなく、検証に失敗します)。
完全を期すために、これが私が物事を検証する方法です:
cfg = ConfigObj(filename, configspec=config_specification.split('\n'))
test = cfg.validate(Validator())
valid = True
for (section_list, key, _) in flatten_errors(cfg, test):
if key is not None:
print('Invalid value for key {0} in section {1}'.format(key,', '.join(section_list)))
valid = False
else:
print('Section {0} failed validation'.format(', '.join(section_list)))
valid = False
if not valid:
exit(3)