13

この方法で引数とキーワード引数を受け入れる必要があるメソッドを持つPythonクラスがあります

class plot:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs):
        for arg in args:
            <do something>
        for key in kwargs:
             <do somethng else>

電話するとき:

plt = plot(x, y)
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3")

エラーが発生します:TypeError: set_axis() got multiple values for keyword argument 'xlabel'

とにかく私が私の方法を次のように設定した場合

class plot:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def set_axis(self, xlabel="x", ylabel="y", *args, **kwargs):
        for arg in args:
            <do something>
        for key in kwargs:
             <do somethng else>

と電話:

plt = plot(x, y)
plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3")

SyntaxError: non-keyword arg after keyword arg期待通りになりました。最初のケースの何が問題になっていますか?デフォルト以外のユーザー引数とキーワード引数を受け入れるようにメソッドに指示するにはどうすればよいですか?(私の質問が十分に明確であることを願っています)

4

3 に答える 3

15

Python 3では、これは機能します。

Python 3.2.3 (default, Oct 19 2012, 19:53:16) 
>>> def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs):
...     print(args, xlabel, ylabel, kwargs)
... 
>>> set_axis(None, "test1", "test2", xlabel="new_x", my_kwarg="test3")
('test1', 'test2') new_x y {'my_kwarg': 'test3'}
>>> 
于 2012-12-22T15:59:40.953 に答える
14

別のパターンを使用します。

def set_axis(self, *args, **kwargs):
    xlabel = kwargs.get('xlabel', 'x')
    ylabel = kwargs.get('ylabel', 'y')

これにより、キーワード引数が定義されていない場合にフォールバック値を保持しながら、*および**を使用できます。

于 2012-12-22T15:57:07.557 に答える
3

ジュレC.の答えへのわずかなtweekはここにあります:

def set_axis(self, *args, **kwargs):
    xlabel = kwargs.pop('xlabel', 'x')
    ylabel = kwargs.pop('ylabel', 'y')

削除するように変更getし、存在する場合popは削除xlabelします。これを行ったのは、元の質問の残りのコードに、とを除くすべてを反復処理することを目的としたループが含まれているためです。ylabelkwargskwargs xlabelylabel

于 2016-05-18T19:37:13.920 に答える