【Python】TypeError: f() takes exactly 1 arguments (2 given)

エラーを調査してましたら、うっかり紛らわしいケースが見つかりました。

関数を実行するときに引数の数が正しくないと、タイトルのようなエラーがでます。

例1

ためしに、引数が正しい処理と正しくない処理を実行してみます。

test.py

def printNum(a, b):
  print a
  print b

printNum(3, 5)      # <-- うまくいく
printNum(3, 5, 6)   # <-- エラーになる

実行結果

3
5      # <-- ここまではうまくいってる出力結果
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    printNum(3, 5, 6)
TypeError: printNum() takes exactly 2 arguments (3 given)

すぐにわかりますね。

例2

stackoverflowにこんな記事を見つけました。
stackoverflow.com

再現するようにやってみたんですが、再現しないですね。
記事としても3年前ですから、修正したのかもしれません。

test.py

def printNum(a, b=5):
  print b

printNum(b=3)  # aではなくてbを指定してみる。

実行結果

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    printNum(b=3)
TypeError: printNum() takes at least 1 non-keyword argument (0 given)

TypeError: printNum() takes at least 1 non-keyword argument (0 given)
であれば、まあなんとかどこが悪かったかはすぐにわかるでしょう。