TypeError:引数に複数の値を取得しました


143

私はこのエラーに関係した他のスレッドを読みました、そして私の問題は私がこれまでに読んだすべての投稿より興味深い明確な違いがあるようです、すなわち、これまでの他のすべての投稿は作成されたユーザーのいずれかに関してエラーを持っていますクラスまたは組み込みシステムリソース。関数を呼び出すときにこの問題が発生しています。何ができるのかわかりません。何か案は?

BOX_LENGTH = 100
turtle.speed(0)
fill = 0
for i in range(8):
    fill += 1
    if fill % 2 == 0:
        Horizontol_drawbox(BOX_LENGTH, fillBox = False)
    else:
        Horizontol_drawbox(BOX_LENGTH, fillBox = True)

    for i in range(8):
        fill += 1
        if fill % 2 == 0:
            Vertical_drawbox(BOX_LENGTH,fillBox = False)
        else:
            Vertical_drawbox(BOX_LENGTH,fillBox = True)

エラーメッセージ:

    Horizontol_drawbox(BOX_LENGTH, fillBox = True)
TypeError: Horizontol_drawbox() got multiple values for argument 'fillBox'

5
Horizontol_drawbox関数の宣言は何ですか?で始まる場合はfillBox、それが障害です(位置引数で1回、キーワード引数で2回割り当てられます)。
Cilyan 14

回答:


223

これは、位置引数を上書きするキーワード引数が指定されている場合に発生します。たとえば、色付きのボックスを描画する関数を想像してみましょう。この関数は、使用する色を選択し、ボックスの描画を別の関数に委任して、すべての追加の引数を中継します。

def color_box(color, *args, **kwargs):
    painter.select_color(color)
    painter.draw_box(*args, **kwargs)

その後、呼び出し

color_box("blellow", color="green", height=20, width=30)

二つの値が割り当てられているので失敗しますcolor"blellow"位置とし、"green"キーワードとして。(および引数painter.draw_boxを受け入れることになっています)。heightwidth

これは例では簡単に確認できますが、もちろん、呼び出し時に引数を取り違えると、デバッグが難しくなる場合があります。

# misplaced height and width
color_box(20, 30, color="green")

ここでcolorは、が割り当てられ20、その後args=[30]color再び割り当てられ"green"ます。


興味深い-私がこのエラーにぶつかったとき、それはまたcolor議論についてでした。問題は少し異なっていました-私のmodel_matrix引数はキーワードのみになり、いくつかのレガシーコードはそれを位置引数として渡しました。新しいAPIはを期待していましたがcolor、代わりに4x4マトリックスを取得しました。
Tomasz Gandor 2017

こんにちは、2番目の例ではわかりません。また、次の条件も満たしますWhen a keyword argument is specified that overwrites a positional argument。しかし、なぜ後者が機能するのでしょうか?Pythonが引数を割り当てるときのルールは何ですか。ありがとうございました。
Alston、2017年

2
@ストールマン:私が挙げた2番目の例も機能しません。color = 20はcolor = "green"と競合します。割り当てのルールは直後に与えられます。詳細:docs.python.org/3/tutorial/controlflow.html#keyword-arguments特に4つの「無効な呼び出し」の例の3番目。
Cilyan 2017年

70

同じ問題が非常に簡単に発生しましたが、確認するのにしばらく時間がかかりました。

宣言を自分が使用していた場所にコピーし、そこに「自己」の議論を残していましたが、それを理解するのに年月がかかりました。

持っていた

self.myFunction(self, a, b, c='123')

しかし、それはあったはずです

self.myFunction(a, b, c='123')

1
または、最初selfにクラス名に置き換えます。;)
Tomasz Gandor 2017

49

これは、selfクラスメソッド内の宣言を忘れた場合にも発生します。

例:

class Example():
    def is_overlapping(x1, x2, y1, y2):
        # Thanks to https://stackoverflow.com/a/12888920/940592
        return max(x1, y1) <= min(x2, y2)

次のように呼び出すと失敗self.is_overlapping(x1=2, x2=4, y1=3, y2=5) します:

{TypeError} is_overlapping()が引数 'x1'の複数の値を取得しました

WORKS

class Example():
    def is_overlapping(self, x1, x2, y1, y2):
        # Thanks to https://stackoverflow.com/a/12888920/940592
        return max(x1, y1) <= min(x2, y2)

このコメントは、問題を特定するのに役立ちますself。関数宣言内に引数を追加するのを忘れています。つまり、何をdef myFunction(self, a, b, c='123')書いておくべきかということですdef myFunction(a, b, c='123')。またb、リストをc取り、スカラーを受け取るため、自分自身が欠落していると、引数がめちゃくちゃになり、最終的にの入力bがにcなり、「複数の引数」エラーが発生します。私はこの内部メソッドをクラスの外でテストし、self元に戻すことを忘れたので、この間違いを犯しました。
yuqli

@yuqliこれはまさに私がこの問題に取り組む方法でもあります。;)この投稿がお役に立てたことを嬉しく思います。
gies0r

1
私もかなり時間を節約できました:)
nexla

また、本質的に必要とされない@staticmethod場合により良いアプローチであるかもしれない関数を装飾した後に働きselfます。
ayorgo

21

私の問題はQ --- tenの問題に似ていましたが、私の場合、クラス関数に自己引数を指定するのを忘れていました。

class A:
    def fn(a, b, c=True):
        pass

なるはず

class A:
    def fn(self, a, b, c=True):
        pass

この不完全な実装は、クラスメソッドを次のように呼び出すとわかりにくいです。

a_obj = A()
a.fn(a_val, b_val, c=False)

どちらが得られますTypeError: got multiple values for argument。うまくいけば、ここでの残りの回答は、誰でもエラーをすばやく理解して修正できるほど十分に明確です。そうでない場合は、この答えがあなたに役立つことを願っています!


2
ああ、「自分」を忘れることも私の問題でした。何という誤解を招く例外がスローされるのでしょう
pcko1

3

簡単に言うと、次のことはできません。

class C(object):
    def x(self, y, **kwargs):
        # Which y to use, kwargs or declaration? 
        pass

c = C()
y = "Arbitrary value"
kwargs["y"] = "Arbitrary value"
c.x(y, **kwargs) # FAILS

変数 'y'を関数に2回渡すためです。1つはkwargsとして、もう1つは関数宣言としてです。


2

私がここに連れて来られたのは、これまでの回答で明示的に言及されていない理由で、他の人のトラブルを救うためです。

エラーは、関数の引数の順序が変更された場合にも発生します-受け入れられた回答と同じ理由で、位置引数はキーワード引数と競合します。

私の場合、パンダset_axis関数の引数の順序が0.20と0.22の間で変更されたためです。

0.20: DataFrame.set_axis(axis, labels)
0.22: DataFrame.set_axis(labels, axis=0, inplace=None)

set_axisの一般的な例を使用すると、次のように呼び出すため、この混乱するエラーが発生します。

df.set_axis(['a', 'b', 'c'], axis=1)

0.22より前で['a', 'b', 'c']は、最初の引数である軸に割り当てられ、次に位置引数は「複数の値」を提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.