HOWTO · Python

Python の Return Outside Function エラーを修正

Python の return outside function エラーを修正する方法です。

このページの内容

Python が SyntaxError: 'return' outside function を報告した場合は、return 文を関数本体の中に移動します。Python はプログラムの実行前にファイルを解析するため、モジュールレベルにある return は拒否されます。インデントと周囲の def ブロックを確認してください。トップレベルでは、関数を呼び出して戻り値を利用します。

return outside function エラーを理解する

return キーワードは、現在の関数から呼び出し元のコードへ値を返します。構文上、return を書けるのは関数本体の中だけです。モジュールレベルに return 文があると、Python は SyntaxError を発生させ、メッセージに 'return' outside function と表示します。

Python のパーサーは、ファイルを実行する前に全体を確認します。そのため、トップレベルに return があると、それより前に書かれた文も実行されません。エラーメッセージは return の行を示しますが、原因は後方にある文の置き場所や、意図した位置より早く関数を抜けてしまったインデントかもしれません。たとえば、トップレベルの無効な文 return 10 は、次の解析エラーを引き起こします。

SyntaxError: ‘return’ outside function

return を関数の中に移動する

return 文を、関数内のほかの文と同じインデント位置に置きます。その後、モジュールレベルのコードからその関数を呼び出します。次の例を実行してください。

このセクションのコードと表示されるラベルや出力は英語のままです。

def calculate_total(price, quantity):
    return price * quantity

print(calculate_total(8, 3))
24

ここでは、return price * quantity は calculate_total の中にあり、呼び出し時に 8 と 3 が引数として渡されます。返された値は、そのまま print に渡されます。計算式と引数を、自分の関数で必要な処理に置き換えてください。

条件分岐やループだけでは関数になりません。if、for、while ブロック内で return を使えるのは、そのブロックが関数の中にある場合だけです。次の追加例は構文上有効ですが、提供された実行証拠では確認されていません。

def first_match(items):
    for item in items:
        if item == "target":
            return item
    return None

print(first_match(["other", "target", "later"]))

return item の行は、関数と if ブロックの両方の中にあります。一致する項目が見つかると、そこで first_match を終了します。そのため、呼び出しの戻り値が print に渡されます。一致する項目がなければ、最後の return None が実行されます。また、関数が return に到達せずに終了した場合も、暗黙に None を返します。

インデントと関数定義を確認する

Python はインデントによって、どの文が関数に属するかを判断します。def と同じ位置に揃った行はその関数の外側にあり、def の下にインデントされた行は関数本体の一部です。def get_value(): の直後にインデントを戻すと、関数本体がないため、Python は SyntaxError: 'return' outside function ではなくインデントエラーを報告します。報告されたエラーを発生させるには、まず pass などの有効な文を関数本体に置き、その後 return 5 を左端に置きます。この最後の行はトップレベルの return になります。修正後は、return 5 を def get_value(): の下にインデントします。通常は半角スペース4つを使うなど、インデントを統一してください。エラー箇所の直前の行を確認すると、関数ブロックがどこで終わったかを特定しやすくなります。

関数のヘッダーが正しく、末尾がコロンになっていることも確認します。たとえば my_function(): は def がないため不正です。この場合、Python はそのヘッダーの構文エラーを報告します。関数の return が本体の外にあるものとして扱うわけではありません。ヘッダーの誤記や未完成によって、別のエラーメッセージが出ることもあります。まずヘッダーを直し、その後 return の行がその下にインデントされていることを確認してください。診断の要点は、その文が実際に関数本体の中にあるかどうかです。

モジュールレベルでは関数を呼び出す

モジュールレベルのコードとは、Python ファイル内で関数やクラスの外側にある部分です。そこから関数を呼び出し、戻り値を変数に代入して、その値を表示したり利用したりできます。たとえば、answer = calculate_total(8, 3) と書いてから answer を使います。モジュールレベルに return calculate_total(8, 3) と書いてはいけません。

デバッグでは、Python が示した行と、最も近い def に対するインデントを確認してください。その行がすでにインデントされている場合は、さらに前に関数本体を終了させたインデント戻しがないか調べます。関数定義そのものが不正なら、その構文を別途修正してください。return が意図した関数に属するように直したら、周囲のモジュールレベルのコードから関数を呼び出します。これにより、関数から値を返すことと、その値をプログラムの残りの部分で使うことを区別できます。