ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【Python】関数に関数の引数をわたすときのエラーについて

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"