TypeError: not supported between instances of ‘NoneType’ and ‘int’ が出た時の対応

Pythonプログラミングを試している中で、下記エラーメッセージがでました。

File xxx, line 37, in 
    print(set_range(10, 4, 7))
File xxx, line 33, in set_range
    r = biggest(a, b, c) - smallest(a, b, c)
File xxx, line 10, in biggest
    mx = bigger(bigger(a, b), c)
File xxx, line 4, in bigger
    if a > b:
TypeError: > not supported between instances of ‘NoneType’ and ‘int’

前にも見た事があるエラーですが、その時は未熟者故Google先生に聞いても、一発で分かる様な回答が出てこなかった事から、出てきた回答が何を意味しているのか突き止める事ができず、一から作り直したり、そのコードから撤退したりしていました。

今回は解決で来たので備忘エントリーです。

エラーが出た元のhコードは下記のコードです。

def set_range(a, b, c):
    def bigger(a, b):
        if a > b:
            return
        else:
            return b

    def biggest(a, b, c):
        mx = bigger(bigger(a, b), c)
        return mx

    def smallest(a, b, c):
        big = biggest(a, b, c)
        small = 0
        if big == a:
            if b < c:
                small = b
            else:
                small = c
        if big == b:
            if a < c:
                small = a
            else:
                small = c
        else:
            if a < b:
                small = a
            else:
                small = b
        return small
    r = biggest(a, b, c) - smallest(a, b, c)
    return r


print(set_range(10, 4, 7))


print(set_range(1.1, 7.4, 18.7))

このエラーメッセージを元にGoogle先生に聞いても、「これは〜だから〜を変更すれば良い」的な直接的な回答が出てきません。

しかし、stackoverflow
にこの問題の解に通じる意味が書かれていました。

"The problem isn't the input. Python will implicitly return None from the valid input function. And there are two different vPopSize variables here "

どこかでreturnで上手く返っていない様なので見返しました。
と思ったら、5行目でaを書き漏れて返っていませんでした。

        if a > b:
            return a
        else:
            return b

が正しい記載です。

ちなみに、下記のコードの"return mx"を削っても

   def biggest(a, b, c):
        mx = bigger(bigger(a, b), c)
        return mx

下記のエラーが出ます。

TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
        

今回は簡単な抜けでしたが、このエラーが出たらreturnが上手く返っているか、を重点にチェックする様にしましょう。