2

私は 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)
4

2 に答える 2

4

私は現在の configobj 開発者の 1 人です。この単体テストによると、期待どおりsensors = $virtual,に動作すると思います。

($virtual,)2要素リストを返すことについてどう思うかわかりません。それは間違っているようです。暗黙の空の文字列が実際に必要になると予想されるシナリオを想像できない限り、おそらく問題を開く価値があります。

于 2014-08-29T13:33:30.523 に答える
1

docsによると、とにかく必要な文字列であれば、configspec を使用するだけsensors = force_list()で、単一の要素リストの最後に奇妙なコンマは必要ありません。

于 2015-05-14T17:32:14.720 に答える