Файл конфигурации проверки Python Yaml

Я использую yaml для хранения моих данных конфигурации. как только я загружу файл. Я хочу проверить, существуют ли определенные ключи и значения.

yaml:

sftp:
 host: server
 username: user
 password: pass
 path: /mnt/Storage/Folder/

filename: blah

поэтому мне нужно знать, существуют ли эти ключевые значения в файле yaml. поскольку они необходимы для правильной работы. Каков наилучший способ сделать это? Я могу использовать этот метод ниже, мне придется вручную проверять один. Необходимые ключевые значения будут расти, это как минимум.

if (key in data):
    return True
0
источник поделиться
2 ответа

Есть несколько подходов. Поскольку ваш ввод более сложный, чем, скажем, dict с двумя ключами, я бы пошел с номером четыре, библиотекой для выражений пути, например jsonpath.

  1. Полностью ручной

    Вы перемещаетесь через дерево объектов, создаете исключение, если что-то неожиданно.

    Pro/con: Максимальное управление, а также над сообщениями об ошибках, но минимальная описательность.

  2. Ручная оценка пути

    Вы определяете ожидаемые "пути", а затем имеете (возможно, вложенный) цикл, проходящий через каждый, и оцениваете, соответствует ли входной объект пути. Ответ Philips относится к этой категории.

    Такие вопросы, как этот xpath для dicts, могут указывать на благоприятное направление, по реализации.

    Pro/con: Может быть описательным, но может быть нетривиальным, чтобы получить оценку для всех угловых случаев.

  3. Встроенная оценка

    Вы определяете набор функций, которые должны оцениваться в значение, отличное от None. Python делает оценку для вас. Что-то в этом роде:

    must_evaluate = {
        lambda o: o["sftp"]["host"],
        lambda o: o["sftp"]["username"],
        lambda o: o["sftp"]["passowrd"],
        lambda o: o["sftp"]["path"],
        lambda o: o["filename"],
    }
    
    
    def check_with_builtin_resolution(obj):
        def check_lambda_on_obj(l):
            try:
                if l(obj) is not None:
                    return True
            except AttributeError:
                pass
            except KeyError:
                pass
            return False
    
        for l in must_evaluate:
            if not check_lambda_on_obj(l):
                return False
        return True
    

    Pro/con: Достаточно описательный, хотя и не такой приятный, как пути в 2 или 4. Самый большой con: нет тривиального способа описать, чего ожидать не удалось, поскольку лямбды плохо печатаются.

  4. Библиотека для выражений пути

    Используйте библиотеку для выражений пути, например jsonpath. Перебирайте каждое выражение и создавайте исключение, когда оно не оценивает, что вы хотите.

    Pro/con: Разумная и хорошая поддержка достойных сообщений об ошибках.

  5. Библиотека для проверки дерева объектов

    Возможно, какой-то другой плакат знает о существовании, зрелой работе. Я сам, будучи обеспокоен этой проблемой, начал возиться с parseobj, но пока не могу рекомендовать это для реального использования.

+1
источник

Поэтому, чтобы убедиться, что каждый ключ, который вам нужен, вам нужно будет проверить каждый из них явно каким-то образом. Однако, если ключи уникальны, вы можете использовать наборы, чтобы сделать его немного более чистым, например,

needed = set(["host", "username", "password"]) #etc.

затем для обнаружения/чтения в файле YAML:

seen = set()
for key, value in data.iteritems():
    seen.add(key)

return needed.issubset(seen)
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос