Обдумав ранние ответы и немного подумав, я пришел к следующему решению:
def num_input(prompt, error):
s = raw_input(prompt)
for t in (int, float, complex):
try: return t(s)
except ValueError: pass
print error
return num_input(prompt, error) #better get it in the first 1k tries
Мне действительно нужна функция ввода, а не просто функция проверки; однако, я думаю, HYRY предложение перебрать int, float, complex является хорошим. Я принял предложение win использовать рекурсию вместо цикла, понимая, что действительно запутанный и постоянный пользователь может превысить максимальную глубину рекурсии. Хотя мне это и не нужно сейчас, я думаю, Карл Кнехтель правильно делает ошибку ошибочной, а не жестко закодированной.