YAMLファイル(AWS設定変数を含む)を入力として受け入れ、HTTP k/v API(Consulなど)にアップロードできるようにJSONに変換する設定変数エンジンを作成する実験を行っています。私が困惑している機能は、開発者が後続のキーでキーセット(最後のペイロードでは省略されたアンダースコアで識別される)を「インクルード」することを可能にします。あなたが見ることができるように、私は彼らが望むなら、それらを上書きする/グループ変数に開発を可能にする設定ファイルを構築し、subsquently含めるしようとしていますディクショナリを再帰的に参照し、値を後で参照できるように動的に更新するにはどうすればよいですか?
# Region
us-east-1:
# Any key preceded by an underscore (_) is considered a "tag group" and will not be uploaded to Consul KV unless explicitly included.
_taggroup1:
key1: value1
key2: value2
key3: value3
_taggroup2:
key4: value1
key5: value2
key6: value3
dev:
_include: us-east-1/_taggroup1
qa:
_include:
- us-east-1/_taggroup1
- us-east-1/_taggroup2
key6: baz
prod:
_include:
- us-east-1/_taggroup1
- us-east-1/_taggroup2
us-west-1:
_taggroup1:
key1: value1
key2: value2
key3: value3
_taggroup2:
key4: value1
key5: value2
key6: value3
dev:
_include:
- us-west-1/_taggroup1
qa:
_include:
- us-west-1/_taggroup1
- us-west-1/_taggroup2
key2: foo
prod:
_include:
- us-west-1/_taggroup1
- us-west-1/_taggroup2
key4: foo
key5: bar
key1: undef
us-west-1a:
qa:
_include: us-west-1/qa
prod:
_include: us-west-1/prod
us-west-1b:
_include: us-west-1/us-west-1a
次のように模範です。
私はこれまでのところ、この実験のために書かれているコードは、本質的に、このアプリケーションに固有の追加を使用して、標準的な再帰関数です:
# parse_input is a separate function that converts a YAML stream into
# an OrderedDict
original_dict = parse_input(stream1)
def print_dict(input_dict):
new_dict = collections.OrderedDict()
for key, value in input_dict.iteritems():
if key.startswith('_'):
if key == '_include':
if isinstance(value, list):
for item in value:
x = dpath.util.get(original_dict, item)
for k, v in x.iteritems():
new_dict[k] = v
else:
x = dpath.util.get(original_dict, value)
for k, v in x.iteritems():
new_dict[k] = v
else:
continue
continue
elif isinstance(value, dict):
new_dict[key] = print_dict(value)
else:
new_dict[key] = value
return new_dict
これまでのところ、私が達成したことを出力されているような:
{
"us-east-1": {
"dev": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"qa": {
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value1",
"key5": "value2",
"key6": "baz"
},
"prod": {
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value1",
"key5": "value2",
"key6": "value3"
}
},
"us-west-1": {
"dev": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"qa": {
"key1": "value1",
"key2": "foo",
"key3": "value3",
"key4": "value1",
"key5": "value2",
"key6": "value3"
},
"prod": {
"key1": "undef",
"key2": "value2",
"key3": "value3",
"key4": "foo",
"key5": "bar",
"key6": "value3"
},
"us-west-1a": {
"qa": {
"_include": [
"us-west-1/_taggroup1",
"us-west-1/_taggroup2"
],
"key2": "foo"
},
"prod": {
"_include": [
"us-west-1/_taggroup1",
"us-west-1/_taggroup2"
],
"key4": "foo",
"key5": "bar",
"key1": "undef"
}
},
"us-west-1b": {
"qa": {
"_include": "us-west-1/qa"
},
"prod": {
"_include": "us-west-1/prod"
}
}
}
}
ご覧のとおり、途中にあるようです。私の問題は私の最初の実験では、私は(キーを返すようにdpath
を使用して)設定が含まを参照するときに、関数内original_dict
変数を参照することで良好な結果を得ていたということです。これは、元のdictのキーを動的に更新する方法や変更を追跡する方法がわからないため、関数がより深く再帰する(この場合は、AZ固有の変数)ので、すぐに問題になります。キーは_include
キーで設定され、再評価に失敗します。
にはどうすれば元の辞書を参照するに応じて排除しない、と_include
キーが適切に木に深く評価されるようにではなく、動的に変更を追跡しますか?
これは動作するように表示されます!ありがとう、私は(明らかに)それをまだ試していなかった! :) – asdoylejr