как получить элементы словаря, хранящиеся в списке в python 3.6 - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть список, который содержит разные словари;

[{'header-name': 'x-frame-options', 'ignore': False, 'expected-value': ['deny', 'sameorigin']}, {'header-name': 'content-security-policy', 'ignore': False, 'expected-value': []}]

Я использую этот метод, чтобы извлечь все поля из словаря

    def use_custom_setting(self, header, contents):
        warn = 1
        if header == "x-frame-options":
            for value in self.custom:
                for keys, values in value.items():
                    if keys == "header-name" and values == "x-frame-options":
                        print(keys,values)
                        if keys== "ignore" and values == False: # i dont reach here 
                            if keys == "expected-value":
                                print(values)
                                if contents.lower() in values:
                                    warn = 0
                                else:
                                    warn = 1
                            print(values)
                        else:
                            print("This header is skipped based on configure file")

        return {'defined': True, 'warn': warn, 'contents': contents}

Моя цель - получить заголовок -имя содержимого и игнорировать содержимое и содержимое с ожидаемым значением?

1 Ответ

1 голос
/ 02 апреля 2020

Второе выражение if никогда не будет верным, потому что оно вложено в первое. Это означает, что он оценивается только в том случае, если внешний равен True. То же самое касается первого. Подумайте об этом:

Первый оператор if проверяет, равен ли keys "header-name", а второй проверяет, снова ли keys равен "ignore". Конечно, если оно имеет значение "header-name", оно также не будет "ignore".

Вам необходимо отложить вложенные операторы if:

for keys, values in value.items():
    if keys == "header-name" and values == "x-frame-options":
        print(keys,values)
    if keys== "ignore" and values == False: # i dont reach here 
        print(keys,values)
    if keys == "expected-value":
        print(keys,values)

РЕДАКТИРОВАТЬ: Вам необходимо немного разделить свои проблемы. Одна часть логики c (та, что я привел здесь) предназначена только для определения того, на какой ключ вы смотрите. Затем вы можете go дальше делать вещи со значениями, которые они содержат:

ignoreItem = False # This variable is reset for every dictionary
for keys, values in value.items():
    if keys== "ignore": # i dont reach here 
        ignoreItem = values
    if keys == "expected-value" and ignoreItem:
        print(keys,values)

Обратите внимание, как я сохранил значение "ignore", а затем в следующий раз, когда l oop обошел, я использовал это сохраненное значение, чтобы определить, буду ли я печатать "expected-value".

Кстати, вся эта структура немного странная. Если ключи словарей известны, почему бы не использовать их напрямую:

if value["header-name"] == "x-frame-options":
    if value["ignore"] == False:
        print(value["expected-value"]) # Do your stuff here
...