Python assert -- improved introspection of failure?

assert, debugging, python, syntactic-sugar

Solution

Install your of function as `sys.excepthook` -- see the docs. Your function, if the second argument is `AssertionError`, can introspect to your heart's contents; in particular, through the third argument, the traceback, it can get the frame and exact spot in which the assert failed, getting the failing exception through the source or bytecode, the value of all relevant variables, etc. Module inspect helps.

Doing it in full generality is quite a piece of work, but depending on what constraints you're willing to accept in how you write your `assert`s it can be lightened substantially (e.g. restricting them to only local or global variables makes introspection easier than if nonlocal variables of a closure could be involved, and so forth).

Problem

This is a rather useless assertion error; it does not tell the values of the expression involved (assume constants used are actually variable names): ``` $ python -c "assert 6-(3*2)" [...] AssertionError ``` Is there a better `assert` implementation in Python that is more fancy? It must not introduce additional overhead over execution (except when assert fails) .. and must turn off if `-O` flag is used. Edit: I know about assert's second argument as a string. I don't want to write one .. as that is encoded in the expression that is being asserted. DRY (Don't Repeat Yourself).

Original source