Quantcast
Channel: Best practice for using assert? - Stack Overflow
Viewing all articles
Browse latest Browse all 17

Answer by Lutz Prechelt for Best practice for using assert?

$
0
0

The four purposes of assert

Assume you work on 200,000 lines of code with four colleagues Alice, Bernd, Carl, and Daphne.They call your code, you call their code.

Then assert has four roles:

  1. Inform Alice, Bernd, Carl, and Daphne what your code expects.
    Assume you have a method that processes a list of tuples and the program logic can break if those tuples are not immutable:

    def mymethod(listOfTuples):    assert(all(type(tp)==tuple for tp in listOfTuples))

    This is more trustworthy than equivalent information in the documentationand much easier to maintain.

  2. Inform the computer what your code expects.
    assert enforces proper behavior from the callers of your code.If your code calls Alices's and Bernd's code calls yours,then without the assert, if the program crashes in Alices code,Bernd might assume it was Alice's fault,Alice investigates and might assume it was your fault,you investigate and tell Bernd it was in fact his.Lots of work lost.
    With asserts, whoever gets a call wrong, they will quickly be able to see it wastheir fault, not yours. Alice, Bernd, and you all benefit.Saves immense amounts of time.

  3. Inform the readers of your code (including yourself) what your code has achieved at some point.
    Assume you have a list of entries and each of them can be clean (which is good)or it can be smorsh, trale, gullup, or twinkled (which are all not acceptable).If it's smorsh it must be unsmorshed; if it's trale it must be baludoed;if it's gullup it must be trotted (and then possibly paced, too);if it's twinkled it must be twinkled again except on Thursdays.You get the idea: It's complicated stuff.But the end result is (or ought to be) that all entries are clean.The Right Thing(TM) to do is to summarize the effect of yourcleaning loop as

    assert(all(entry.isClean() for entry in mylist))

    This statements saves a headache for everybody trying to understandwhat exactly it is that the wonderful loop is achieving.And the most frequent of these people will likely be yourself.

  4. Inform the computer what your code has achieved at some point.
    Should you ever forget to pace an entry needing it after trotting,the assert will save your day and avoid that your codebreaks dear Daphne's much later.

In my mind, assert's two purposes of documentation (1 and 3) and safeguard (2 and 4) are equally valuable.
Informing the people may even be more valuable than informing the computerbecause it can prevent the very mistakes the assert aims to catch (in case 1)and plenty of subsequent mistakes in any case.


Viewing all articles
Browse latest Browse all 17

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>