Pythonでマルチラインラムダがない理由

Pythonでは、lambdaを使って1行で簡潔な関数を定義できますが、複数行にまたがるラムダ関数はサポートされていません。これは、Pythonの設計哲学における「明確さ」と「シンプルさ」を重視する方針によるものです。Pythonでは、インデントが構文の一部として機能するため、複雑な構造を持つマルチラインラムダを導入すると、読みやすさやコードの一貫性が損なわれるリスクがあります。

構文的な曖昧さ

たとえば、次のようなコードを考えます:

map(lambda x: 
        y = x + 1
        return y, [1, 2, 3])

この場合、どこでラムダが終了し、どこが新しい構文ブロックなのかが不明確です。インデントが適切に管理されないと、式の終わりが曖昧になり、エラーを引き起こす可能性があります。

Guido van Rossumの見解

Pythonの創設者であるGuido van Rossum自身も、マルチラインラムダの実装については理論的に可能だと認めつつも、それは「非Python的」であり、構文解析に大きな複雑さをもたらすと述べています。Pythonでは複数行の関数を定義する場合、def文を使うことが推奨されています。

代替手段

通常の関数を定義する

ラムダ関数で複数行の処理を行いたい場合、通常の関数を定義する方法が最も適切です。

def process(x):
    y = x + 1
    return y
map(process, [1, 2, 3])

カンマを使ったタプル式

簡単なケースでは、ラムダ内でカンマを使って複数の式を実行する方法もあります。

lambda x: (foo(x), bar(x))

これは、簡潔なコールバックや一時的な関数を作る際に役立ちますが、複雑なロジックには不向きです。

まとめ

Pythonではマルチラインラムダはサポートされていませんが、これはPythonのシンプルで明確な構文を維持するための設計上の決定です。複数行の処理が必要な場合は、def文を使って明確に関数を定義するか、簡単なタプル式を利用することで代替が可能です。