[Zope3-dev] Re: Add function for schema validation in zope.schema

Tres Seaver tseaver at palladion.com
Mon Aug 20 10:08:01 EDT 2007


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Wichert Akkerman wrote:
> Previously Christian Theune wrote:
>> Hi,
>>
>> Am Montag, den 20.08.2007, 08:59 -0400 schrieb Fred Drake:
>>> On 8/20/07, Christian Zagrodnick <cz at gocept.com> wrote:
>>>> I think we should add a function to validate a given schema on a given
>>>> class. This should include constraints and invariants:
>>> I do presume you mean object, rather than class, as your example implies.
>>>
>>>> validateSchema(IMySchema, myobject)  [or alike]
>>> +1
>>>
>>>> I'm not sure about return values or exceptions. There are different use cases:
>>>>
>>>> 1. Is the object valid? -> True/False
>>>> 2. What's wrong with the object -> {attribute/field-name: what's
>>>> wrong}, what's wrong with invariants.
>>> There should probably be a specific exception that's defined for this
>>> purpose, and it could directly support the mapping interface to allow
>>> detailed information to be extracted.  I suspect a common use would be
>>> to simply verify the object and raise the exception in the invalid
>>> case, denying whatever operation was being attempted.
>>>
>>> This also suggests that there's no interesting return value; either
>>> the exception is raised or it isn't.  Code that wants to introspect
>>> the exception can catch that and act accordingly.
>> >From my latest experience and research of when to use exceptions and
>> when to use return values I'd say let's not use an exception.
>>
>> The report of "which fields are wrong" is the normal result of this
>> function. Invalid data is not an uncommon output, rather, it's the sole
>> purpose of this function. An exception should be raised if the
>> validation could not be performed.
>>
>> The result could be a structure that lists all errors. Eventually a
>> result that equals False could be used to signal no errors, e.g. an
>> empty dict or an empty list.
> 
> That would be confusing though: I would expect the result of a method
> that checks validaty to return something that evaluates to True if
> everything is valid. Code like this just messes up my brain:
> 
>   if not zope.schema.validate(obj, IMySchema):
> 	  print "Everything validates correctly!"
> 
> to me that is very non-intuitive and looks like the if condition is
> incorrect.

Returning boolean discards the information which only this function
should know, and which the caller (potentially) needs:  the list of
errors.  The name 'validate' doesn't imply a boolean return to me at
all.  I would expect to see it used as follows::

  errors = zope.schema.validate(obj, IMySchema)
  if not errors:
      print 'OK
  else:
      print 'Errors: \n%s' % '\n'.join([str(x) for x in errors])


Tres.
- --
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGyaBB+gerLs4ltQ4RAjDQAJ9e1gY/MxrAF7dOpTcATtQPjLAQ7gCgqy4X
2QztzPecPxDIKEqfvJUr0AI=
=IxRz
-----END PGP SIGNATURE-----



More information about the Zope3-dev mailing list