max*_*max 5 python parsing exception
我发现自己写了这样的断言:
if f(x, y) != z:
print(repr(x))
print(repr(y))
print(repr(z))
raise MyException('Expected: f(x, y) == z')
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法编写一个函数来接受一个有效的Python表达式和一个异常类作为输入,计算表达式,如果它发现它是假的,打印出每个最低级别的表示表达式中的术语并提出给定的异常?
# validate is the mystery function
validate('f(x, y) == z', MyException)
Run Code Online (Sandbox Code Playgroud)
这是一个实现:
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's 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")
Run Code Online (Sandbox Code Playgroud)