1. ホーム
  2. python

[解決済み] クラスメソッドは "TypeError: ... got multiple values for keyword argument ..." を生成する。

2022-05-17 20:11:38

質問

キーワード引数でクラスメソッドを定義する場合、以下のようになります。

class foo(object):
  def foodo(thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

メソッドを呼び出すと TypeError :

myfoo = foo()
myfoo.foodo(thing="something")

...
TypeError: foodo() got multiple values for keyword argument 'thing'

どうしたんだ?

解決方法は?

問題は、python のクラスメソッドに渡される最初の引数が、常にメソッドが呼び出されるクラスのインスタンスのコピーであることです。 self . クラスがこのように宣言されている場合。

class foo(object):
  def foodo(self, thing=None, thong='not underwear'):
    print thing if thing else "nothing" 
    print 'a thong is',thong

は期待通りの動作をします。

説明します。

なし self を最初のパラメータとした場合 myfoo.foodo(thing="something") が実行されると foodo メソッドが引数で呼ばれます。 (myfoo, thing="something") . インスタンス myfoo に割り当てられます。 thing (に割り当てられます。 thing が最初に宣言されたパラメータであるため)、pythonはさらに "something"thing であるため、例外が発生します。

デモのため、元のコードで実行してみてください。

myfoo.foodo("something")
print
print myfoo

のように出力されます。

<__main__.foo object at 0x321c290>
a thong is something

<__main__.foo object at 0x321c290>

thing'にクラス'foo'のインスタンス'myfoo'への参照が割り当てられていることがわかります。 このセクション では、関数の引数がどのように動作するかをもう少し詳しく説明しています。