J'essaye d'utiliser Cerberus en Python pour valider certaines données.
J'ai découvert que pour le type 'booléen', le validateur renvoie toujours True, comme ceci:

import cerberus
bool_schema = {'name': {'type': 'boolean', 'required': True}}
cerberus.schema_registry.add('bool_schema', bool_schema)

v = cerberus.Validator({'name': {'schema': 'bool_schema'}})
test1 = {'name': 'a'}
test2 = {'name': 0}
print(v.validate(test1))
print(v.validate(test2))

Le code ci-dessus imprime deux vrais.
En fait, ce dont j'ai besoin est de valider si la valeur est True ou False (type booléen en Python), les autres valeurs ne doivent pas passer le validateur.

2
Hou Lu 17 janv. 2017 à 17:16

2 réponses

Meilleure réponse

C'est un problème sémantique. Bien que vous n'ayez pas spécifié explicitement ce que vous voulez réaliser, je suppose que vous voulez tester si la valeur mappée à name dans un dictionnaire est un booléen et vous assurer qu'elle est présente.

À la ligne 4 de votre exemple de code, vous définissez un schéma qui fait référence à un schéma précédemment défini à partir d'un registre de schémas. Lors de la validation, il sera interprété comme

{'name': 
    {'schema': {
       {'type': 'boolean',
        'required': True}
}}}

La règle schema de deuxième niveau ne sera traitée que si la valeur de name est un mappage. Dans chacun de vos exemples ce n'est pas le cas, qui ne traitera effectivement aucune règle du tout et donc la validation retourne True à chaque fois.

Afin de répondre à la question que j'ai supposée ci-dessus, cela couvrira:

import cerberus
required_boolean = {'type': 'boolean', 'required': True}
cerberus.rules_set_registry.add('required_boolean', required_boolean)
v = cerberus.Validator({'name': 'required_boolean'})
3
funky-future 18 janv. 2017 à 14:01

Cela peut être un problème avec le registre des schémas (j'ai ouvert un ticket pour que nous puissions l'examiner plus loin - fera rapport ici).

En attendant, vous pouvez ignorer le registre et cela fonctionnera très bien:

from cerberus import Validator

schema = {'name': {'type': 'boolean', 'required': True}}

v = Validator()
v.validate({'name': 'a'})
False

v.errors
{'name': ['must be of boolean type']}

EDIT pour les futurs lecteurs: la réponse de @ funky-future ci-dessous explique en fait pourquoi votre code a échoué et comment y remédier.

2
Nicola Iarocci 18 janv. 2017 à 17:06