Clarity vs. code reuse/generality

MRAB python at mrabarnett.plus.com
Sat Jul 4 14:43:24 EDT 2009


Paul Rubin wrote:
> kj <no.email at please.post> writes:
>> This implies that code that uses *any* assert statement (other than
>> perhaps the trivial and meaningless ones like "assert True") is
>> liable to break, because whatever it is that these assert statements
>> are checking "on some occasions, ... would go unchecked, potentially
>> breaking your code."
> 
> Yes, that implication is absolutely valid.  The purpose of assert
> statements is to debug the code, by checking for conditions that are
> supposed to be impossible.  Unless the program is broken (i.e.  the
> impossible happened), no assert statement should ever trigger.
> 
Technically these are known as "invariants". An assertion will always be
True if the program is bug-free, no matter what the user might throw at
it; it's not the same as validation.

> Invalid input data is not considered impossible and doesn't imply a
> broken program, so assert statements are not the appropriate way to
> check for it.  I like to use a function like
> 
>   def check(condition, msg="data error"):
>      if not condition: raise ValueError, msg
> 
>   ... 
>   check (x >= 0, "invalid x")  # raises ValueError if x is negative
>   y = sqrt(x)
> 
> instead.




More information about the Python-list mailing list