1. ホーム
  2. python

[解決済み] Python、可変長の位置引数の後のデフォルトのキーワード引数

2023-05-25 06:30:04

質問

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)

など

どのように解決するのですか?

動作しますが、Python 3 のみです。PEP を参照してください。 3102 . What's new"のドキュメントをちらっと見たところ、2.xのバックポートがないようなので、運が悪いですね。キーワード引数 ( **kwargs ) を受け取り、手動でパースする必要があります。あなたは d.get(k, default) のどちらかを取得するために d[k] または default がない場合は から引数を取り除くには kwargs から引数を取り除くには、例えばスーパークラスのメソッドを 呼び出す前に d.pop .


なお def get(self, *args, raw=False, vars=None):raw=Falsevars=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