Programming by Contract
Ethan Furman
ethan at stoneleaf.us
Fri Aug 14 21:36:14 EDT 2009
Charles Yeomans wrote:
>
> On Aug 14, 2009, at 12:09 AM, Scott David Daniels wrote:
>
>> Charles Yeomans wrote:
>>
>>> On Aug 11, 2009, at 3:30 PM, Ethan Furman wrote:
>>
>>>> Ethan Furman wrote:
>>
>>>>> Greetings!
>>
>>>>> I have seen posts about the assert statement and PbC (or maybe it
>>>>> was DbC), and I just took a very brief look at pycontract
>>>>> (http://www.wayforward.net/pycontract/) and now I have at least one
>>>>> question: Is this basically another way of thinking about unit
>>>>> testing, or is the idea of PbC more along the lines of *always*
>>>>> checking the input/output of functions to ensure they are correct?
>>>>> (*Contstant vigilance!* as Prof Moody would say ;)
>>
>>>>> I know asserts can be turned off, so they obviously won't work for
>>>>> the latter case, and having seen the sample of pycontract it seems
>>>>> it only does its thing during debugging.
>>
>>>>> So is Design (Programming) by Contract a fancy way of saying
>>>>> "Document your inputs/outputs!" or is there more to it?
>>
>>>>> ~Ethan~
>>
>>>>
>>>> Hmmm...
>>
>>>>
>>>> Well, from the (apparently) complete lack of interest, I shall take
>>>> away the (better?) documentation ideas and unit testing ideas, and
>>>> not worry about the rest. :)
>>
>>>>
>>>>
>>> Design by contract is complementary to unit testing (I notice that
>>> the author of PEP 316 appears confused about this). DbC is, roughly
>>> speaking, about explicit allocation of responsibility. Consider this
>>> contrived example.
>>
>>> def foo(s):
>>
>>> require(s is not None)
>>
>>> //code
>>
>>> ensure(hasattr(returnValue, '__iter__'))
>>
>>
>> yo might want two flags, REQUIRE_OFF, and ENSURE_ON that control
>> testing, and change the code above to:
>> require(REQUIRE_OFF or s is not None)
>> //code
>> ensure(ENSURE_OFF or hasattr(returnValue, '__iter__'))
>>
>> Python has no good way to turn off argument calculation by
>> manipulating function definition (at least that I know of).
>>
>
> For this purpose, it had occurred to me to do something like the following.
>
> def require(condition):
> if condition:
> return True
> else:
> raise PreconditionFailure
>
>
> def foo(s):
> assert require(s is not None)
>
>
> Then it occurred to me to actually read the assert documentation, where
> I learned that one can pass a second expression to assert. So instead
> one might write
>
> assert precondition, "PreconditionFailure"
>
> though I think I prefer the former.
>
>
> Charles Yeomans
>
And in either case, since such checks can have a *huge* impact on
performance, it is good that asserts can be disabled with the -O
optimize switch. So it's also good that the original design for DbC was
an _understanding_ of who is responsible for what, as opposed to _code_
to actually enforce it.
~Ethan~
More information about the Python-list
mailing list