import logging
import sys
import inspect
def log_assert(bool_, message="", logger=None, logger_name="", verbose=False):
"""Use this as a replacement for assert if you want the failing of the
assert statement to be logged."""
if logger is None:
logger = logging.getLogger(logger_name)
try:
assert bool_, message
except AssertionError:
# construct an exception message from the code of the calling frame
last_stackframe = inspect.stack()[-2]
source_file, line_no, func = last_stackframe[1:4]
source = "Traceback (most recent call last):\n" + \
' File "%s", line %s, in %s\n ' % (source_file, line_no, func)
if verbose:
# include more lines than that where the statement was made
source_code = open(source_file).readlines()
source += "".join(source_code[line_no - 3:line_no + 1])
else:
source += last_stackframe[-2][0].strip()
logger.debug("%s\n%s" % (message, source))
raise AssertionError("%s\n%s" % (message, source))
def mr_barnard():
this = "an argument"
log_assert(this is not "an argument",
"Yes it is. - No it isn't. It's just contradiction.",
verbose=True)
if __name__ == "__main__":
logging.basicConfig(filename="argument_clinic", level=logging.DEBUG)
try:
mr_barnard() # room 12
finally:
print "What a stupid concept."