我正在與寫配置變量引擎接受一個YAML文件(包含AWS配置變量)作爲輸入,並且轉換爲JSON,以便它可以被上傳到的HTTPķ/ v的API試驗(如領事)。我被困住的功能將允許開發人員在後續密鑰中「包含」密鑰集(用下劃線標識,在最終有效負載中省略)。一個範例如下:如何遞歸通過字典並動態更新值以便稍後可以引用它們?
# 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
正如你所看到的,我試圖構建一個配置文件,允許開發人員組變量和subsquently包括/覆蓋他們,如果他們的願望。
我已經爲這個實驗到目前爲止寫的代碼基本上與特定於該應用程序的添加您的標準遞歸函數:
# 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
變量中獲得有利的結果。這很快變成一個問題,因爲該功能(在這種情況下,即,AZ-特定變量)遞歸更深,因爲我不知道如何動態地在原來的字典更新密鑰,或以其他方式跟蹤的更改,所以功能將注入一個帶有_include
鍵的密鑰集,並且無法重新評估它們。
如何消除因引用原來的字典,而動態地跟蹤變化,使_include
鍵樹正確評估更深?
這似乎是工作!謝謝,我已經(顯然)還沒有嘗試過! :) – asdoylejr