Python でよくわかってないことがあったので、調べたことをここにメモします。
エラーになるケース
関数に関数の結果をそのまま渡そうとしたらエラーになりました。
def _a(): a = 1 b = "b" return a, b # タプルを返す def _b(a, b): return a, b # 2つの引数を受け取る print(_b(_a()))
出力
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: _b() missing 1 required positional argument: 'b'
エラーの原因
- 「_a()」 は 「(1, "b")」 というタプルを返す
- 「_b()」 は 2 つの引数 「a, b」 を期待している ため、タプル全体 (1, "b") を 1 つの引数として渡すと 型の不一致が発生
正しい書き方
タプルの内容を アンパックして 「_b」 に渡せば回避できそうです。
def _a(): a = 1 b = "b" return a, b # タプルを返す def _b(a, b): return a, b # 2つの引数を受け取る * アンパックして渡す print(_b(*_a())) # (1, "b") ||< ** 補足 「_a()」 が「 (1, "b")」 を返すため、以下の2つは同じ意味になるようです。 >|python| _b(*_a())
_b(1, "b")
「_b(_a())」の記述は、「_b*1」 と同じになり、「TypeError: _b() missing 1 required positional argument: 'b' 」というエラーになります。
まとめ
- 「_a()」 は タプル 「(a, b)」 を返す
- 「_b(a, b)」 は 2 つの個別の引数を受け取る
- 「*」 を使ってタプルを展開「 (_b(*_a())) 」することで正しく渡せる
*1:1, "b"