A bit complicated, but may be interesting:
import re from sys import exc_info,excepthook from traceback import format_exc def condition1(stuff): ''' stuff must be the string of an integer''' try: i = int(stuff) return True except: return False def condition2(stuff): ''' stuff is the string of an integer but the integer must be in the range(10,30)''' return int(stuff) in xrange(10,30) regx = re.compile('assert *\( *([_a-z\d]+)') while True: try: stuff = raw_input("Please enter foo: ") assert(condition1(stuff)) assert ( condition2(stuff)) print("Thanks.") break except AssertionError: tbs = format_exc(exc_info()[0]) funky = globals()[regx.search(tbs).group(1)] excepthook(exc_info()[0], funky.func_doc, None)
result
Please enter foo: g AssertionError: stuff must be the string of an integer Please enter foo: 170 AssertionError: stuff is the string of an integer but the integer must be in the range(10,30) Please enter foo: 15 Thanks.
.
EDIT
I found a way to simplify:
from sys import excepthook def condition1(stuff): ''' stuff must be the string of an integer''' try: int(stuff) return True except: return False def another2(stuff): ''' stuff is the string of an integer but the integer must be in the range(10,30)''' return int(stuff) in xrange(10,30) tup = (condition1,another2) while True: try: stuff = raw_input("Please enter foo: ") for condition in tup: assert(condition(stuff)) print("Thanks.") break except AssertionError: excepthook('AssertionError', condition.func_doc, None)
some_testfunction, please