Зависимости Python Cerberus от уровня вложенного списка - PullRequest
0 голосов
/ 15 мая 2019

Поддерживает ли Cerberus 1.2 проверку зависимостей в списке?

Например, схема выглядит следующим образом:

schema = {
   'list_1': {
     'type': 'list',
     'schema': {
       'type': 'dict',
       'schema': {
         'simple_field': {'type': 'boolean'},
         'not_simple_field': {
           'type': 'dict',
           'schema': {
              'my_field': {'dependencies': {'simple_field': True}}
           }
         }
       }
     }
   }
 }

Правило, которое я хотел бы проверить, состоит в том, что my_field должен существовать только тогда, когда simple_field имеет значение True.Как бы я перевел это в Cerberus?

1 Ответ

1 голос
/ 22 мая 2019

На данный момент Cerberus 1.2 не поддерживает эту функцию.Я переопределил Validator метод класса _lookup_field для реализации этой функциональности.

Вот ссылка на запрос функции на GitHub

Вот моя реализация:

def _lookup_field(self, path: str) -> Tuple:
    """
    Implement relative paths with dot (.) notation as used 
    in Python relative imports
    - A single leading dot indicates a relative import
    starting with the current package.
    - Two or more leading dots give a relative import to the parent(s)
    of the current package, one level per dot after the first
    Return: Tuple(dependency_name: str, dependency_value: Any)
    """
    # Python relative imports use a single leading dot
    # for the current level, however no dot in Cerberus
    # does the same thing, thus we need to check 2 or more dots
    if path.startswith('..'):
        parts = path.split('.')
        dot_count = self.path.count('.')
        context = self.root_document

        for key in self.document_path[:dot_count]:
            context = context[key]

        context = context.get(parts[-1])

        return parts[-1], context

    else:
        return super()._lookup_field(path)
...