2016-12-29 7 views
1

используя python 3.5, я читаю конфигурационный файл (который у меня нет контроля) ищет значение, и он возвращает мне OrderedDict. Я пробовал:python 3.5 получить значение из сложного OrderedDict

l = list(dict.items()) 
for t in l: 
    print(t) 

что вернул список кортежей, значение Я ищу в л [2] - так что я пошел т в л [2], что дало обратно другой сложный выход :

('driver', OrderedDict([('type', 'aws'), ('aws', 
OrderedDict([('upload_credentials', True), ('availability_zones', 
OrderedDict([('eu-west-1', [OrderedDict([('zone', 'eu-west-1a'), ('subnet', 
'10.0.0.0/22')])...('ssl_cert_arn', 'arn:aws:acm:us-west-2:12345667777')]))... 

здесь, где я застрял, я пытался использовать разные для зацикливания, рекурсивные, dict.values ​​и т.д .. но я не могу достичь значения я хочу. Как я могу исходить из этого предположения, что я нахожусь на правильном пути .. Я ищу это значение ssl.

+0

'dpath' может пригодиться: https://github.com/akesterson/dpath-python –

ответ

1

Нам просто придется рекурсивно сканировать по OrderedDict, пока мы не увидим ключ 'ssl_cert_arn'.

def recursive_scan(d, target): 
    if target in d: 
     return d[target] 
    for v in d.values(): 
     if isinstance(v, OrderedDict): 
      ret = recursive_scan(v, target) 
      if ret is not None: #Maybe v[target] is some falsey value like "" 
       return ret 
    return None 

При дальнейшем отражении это может работать еще лучше как генератор.

def recursive_scan(d, target): 
    if target in d: 
     yield d[target] 
    for v in d.values(): 
     if isinstance(v, OrderedDict): 
      yield from recursive_scan(v, target) 
+0

ничего себе, что было быстро, спасибо. Я сделал то, что вы предлагали, но я ничего не получил, я даже добавил печать в начале функции и все еще ничего. recursive_scan (config, 'ssl_cert_arn') и я напечатал (d) перед первым заявлением if, я ценю ваше терпение на этом. Если я печатаю (config) вне функции, я получаю OrderedDict как ожидалось. Что мне недостает друга? –

+0

@NaimSalameh не уверен, если это проблема, но я сделал опечатку. он должен читать 'if isinstance (v, OrderedDict):' –

+0

@NaimSalameh, если вы используете версию генератора, вам придется вывести результат (ы) из списка с чем-то вроде «list (recursive_scan (config, 'ssl_cert_arn')) ' –