Словарь переменных в дуршлаг

Как я могу проверить следующую структуру данных, используя библиотеку дуршлаг?

[
    {
        'bar': ['a', 'b', 'c'],
        'variable2': ['b', 'c'],
        'foo': ['a', 'c'],
    },
    {
        'something': ['foo', 'bar'],
    },
]

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

Я мог бы использовать Mapping(unknown='preserve'), но это не будет проверять типы.

2 ответа

Решение

Глядя на документацию, я не думаю, что вы можете. Вы можете обойти указанное выше ограничение, определив свой собственный валидатор:

Валидатор - это вызываемый объект, который принимает два позиционных аргумента: node а также value, Возвращается None если значение действительно. Это поднимает colander.Invalid исключение, если значение недопустимо.

Я сделал это, но это не швы на работу:

class PolicyValidator(SchemaNode):
    def __init__(self):
        super(PolicyValidator, self).__init__(
            Mapping(unknown='preserve'), validator=self.policy_range)
        # self.add(SchemaNode(Range(min=0, max=0xFFFF), name="preserved"))

    def policy_range(self, node, policy):
        for value in policy.itervalues():
            if value < 0 or value > 0xFFFF:
                raise Invalid(node, '%r is not a valid permission.' % value)

Я нахожу другое решение:

class PolicyValidator(SchemaNode):
    def __init__(self, policy):
        super(PolicyValidator, self).__init__(Mapping(unknown='preserve'))
        for key in policy.iterkeys():
            self.add(SchemaNode(Int(), name=key,
                                validator=Range(min=0, max=0xFFFF)))
Другие вопросы по тегам