Here's the implementation:
import inspect, keyword, pprint, sys, tokenize
def value_in_frame(name, frame):
try:
return frame.f_locals[name]
except KeyError:
try:
return frame.f_globals[name]
except KeyError:
raise ValueError("Couldn't find value for %s" % name)
def validate(expr, exc_class=AssertionError):
"""Evaluate `expr` in the caller frame, raise `exc_class` if false."""
frame = inspect.stack()[1][0]
val = eval(expr, frame.f_globals, frame.f_locals)
if not val:
rl = iter([expr]).next
for typ, tok, _, _, _ in tokenize.generate_tokens(rl):
if typ == tokenize.NAME and not keyword.iskeyword(tok):
try:
val = value_in_frame(tok, frame)
except ValueError:
val = '???'
else:
val = repr(val)
print " %s: %s" % (tok, val)
raise exc_class("Failed to validate: %s" % expr)
if __name__ == '__main__':
a = b = 3
validate("a + b == 5")
source
share