再帰的に関数を実行するときに返り値が取得できない

はまったこと

数値を入力させたいなど,正しい値が得られるまで同じ処理を繰り返したいことがある.
具体的には,例えばこんな感じ.

def get_number():
    try:
        num = raw_input('enter number: ')
    except ValueError:
        get_number()
    else:
        return num

get_number()
type(get_number)

try節でValueErrorが発生したらexcept節で再帰的にget_number()を呼び出す.
いつかValueErrorが発生しない値が得られたら,else節でnumをreturnして終了.
そう考えたくなる.

ところが,

None
<type 'NoneType'>

実行結果はこうなる.
値が返っていない.

正しい書き方

def get_number():
    try:
        num = raw_input('enter number: ')
    except ValueError:
        return get_number()
    else:
        return num

get_number()
type(get_number)

except節で自身を呼び出すときにもreturnしてやると正しく実行できる.
stackoverflow.com

再帰的に実行しているときにreturnで値が返っても,最上位のtry-except文においてはelse節が実行されていないからこうなるらしい.