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:
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.
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 theassert
, 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.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 asassert(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.
Inform the computer what your code has achieved at some point.
Should you ever forget to pace an entry needing it after trotting,theassert
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.