Словарь переменных в дуршлаг
Как я могу проверить следующую структуру данных, используя библиотеку дуршлаг?
[
{
'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)))