Python、可変長の位置引数の後のデフォルトのキーワード引数


82

Python 2の関数呼び出しで可変長の位置パラメーターの後に名前付きパラメーターを使用できると思いましたがSyntaxError、Pythonクラスをインポートするとが表示されます。たとえば、次の「get」メソッドを使用して記述しています。

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars

エラーは次のようになります。

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

メソッドをいくつかの方法で呼び出せるようにしたいと思います。

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

回答:


71

これは機能しますが、Python3でのみ機能します。PEP3102を参照してください。「最新情報」のドキュメントを一瞥すると、2.xバックポートがないように見えるので、運が悪いです。キーワード引数(**kwargs)を受け入れて、手動で解析する必要があります。d.get(k, default)取得するd[k]default、それがない場合に使用できます。kwargsたとえば、スーパークラスのメソッドを呼び出す前に、から引数を削除するには、を使用しますd.pop


def get(self, *args, raw=False, vars=None):raw=Falseおよびvars=Noneはキーワード引数とは関係がないことに注意してください。これらはデフォルトの引数値です。デフォルト値のある引数は位置的に渡すことができ、デフォルト値のない引数はキーワードで渡すことができます。

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

同様に、キーワードのみの引数にデフォルト値を設定する必要はありません。*args引数の後に来るのは、デフォルト値の存在ではなく、キーワードのみとしてそれらをマークするものです。

def f(*args, a): pass
# a is a mandatory, keyword-only argument

あなたとImranの両方に感謝します!Imranのコードブロックとdocstringの提案によるあなたの答えは、質問に完全に答えました。
jkmacc

50

Pythonの構文では、関数内の変数引数とデフォルト値を持つキーワード引数を同時に使用することはできません。任意の数の位置引数とともにキーワード引数が必要な場合は、任意の数のキーワード引数も許可する必要があります。

これは、キーワード引数のデフォルト値を提供し、任意の数の位置引数を許可するための一般的なパターンです。

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

余分なキーワード引数をまったく使用しない場合は、心配する必要はありません。これにより、関数の自己文書化が少し少なくなり、適切に記述されたdocstringで補うことができます。

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